【关于思路】
- 思路很简单,把char类型的字符当作int类型处理,利用ASCII中“大写字母” + 32 = “小写字母”的原理,遍历字符串,将大写字母替换为小写字母。
【出现的问题】
- 虽然程序很简单,但是其中还是有一些被我忽略的内容。
- 以下是我第一次提交的代码,系统表示Wrong Anwser。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string words;
cin >> words;
int i = 0;
int len = words.size();
for(i = 0; i < len; i++) //遍历字符串
{
if(words[i] >= 'A‘ && words[i] <= 'Z')
{
words[i] += 32; //发现大写字母改为小写字母
}
}
cout << words;
return 0;
}
- 问题在于我忽略了题目要求能够输入多组数据,我只考虑了输入一组程序的情形,以下是修改的代码,成功通过系统测试:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string words;
while(getline(cin, words))
{
int i = 0;
int len = words.size();
for(i = 0; i < len; i++)
{
if(words[i] >= 'A' && words[i] <= 'Z')
{
words[i] += 32;
}
}
cout << words << endl;
}
return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
char words[55];
while(scanf("%s, &words") != EOF)
{
int i = 0;
int len = strlen(words);
for(i = 0; i < len; i++)
{
if(words[i] >= 'A‘ && words[i] <= 'Z')
{
words[i] += 32;
}
}
puts(words);
}
return 0;
}
【学习到的东西】
- 这段代码那么简单,我之所以还花时间把它贴到博客上来,是因为其中有些只是确实是我长期以来都不知道,敲完这篇代码才懂得的。
- 关于getline函数 --> C++风格
用getline可以读取整行文本,不会因为一句话中出现一个空格就结束输入,它能够一直读入到某一特定字符结束读入。
getline()的原型是istream& getline ( istream &is , string &str , char delim ),其中 istream &is 表示一个输入流,譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中;char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。
以上内容来源,这里头讲的很清楚
- 关于EOF(End Of File)--> C风格
EOF表示文字流(stream)的结尾。这里的"文字流",可以是文本文件,也可以是标准输入。
在网上看到有些人表示这句话不好理解,其实放到本例应用中,就清楚明白许多,例:while(scanf("%s, & words" ) != EOF):本例的执行效果为每当有字符串输入就执行循环语句,所以这里EOF的意义就是判断是否有数据输入,即是否到达文字流末端,还有没有数据。
这些内容百科上讲的相当详细