1059 老师的苦恼

【关于思路】

  • 思路很简单,把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;
    }
  • 以下是C风格的代码,思想相同,代码上稍有区别:
    #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;
    }

【学习到的东西】

  • 这段代码那么简单,我之所以还花时间把它贴到博客上来,是因为其中有些只是确实是我长期以来都不知道,敲完这篇代码才懂得的。
  1. 关于getline函数 --> C++风格
    用getline可以读取整行文本,不会因为一句话中出现一个空格就结束输入,它能够一直读入到某一特定字符结束读入。
    getline()的原型是istream& getline ( istream &is , string &str , char delim ),其中 istream &is 表示一个输入流,譬如cin;string&str表示把从输入流读入的字符串存放在这个字符串中;char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)。
    以上内容来源,这里头讲的很清楚
  2. 关于EOF(End Of File)--> C风格
    EOF表示文字流(stream)的结尾。这里的"文字流",可以是文本文件,也可以是标准输入。
    在网上看到有些人表示这句话不好理解,其实放到本例应用中,就清楚明白许多,例:while(scanf("%s, & words" ) != EOF):本例的执行效果为每当有字符串输入就执行循环语句,所以这里EOF的意义就是判断是否有数据输入,即是否到达文字流末端,还有没有数据。
    这些内容百科上讲的相当详细
posted @ 2016-04-12 15:12  雨勤未晴丶  Views(154)  Comments(1Edit  收藏  举报