码迷,mamicode.com
首页 > 编程语言 > 详细

[C++]C++ Primer中练习5.11的想法

时间:2020-07-03 12:15:33      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:com   答案   eof   lan   input   nbsp   学习   auto   size   

 https://www.cnblogs.com/DouglasLuo/p/13221356.html

技术图片

  这道练习题要求我们使用C++统计输入的字符串中a, e, i, o, u这五个字符及其大写的数量。这里其实不难,使用switch语句对输入的字符串挨个进行判断,即可得出算出这五个字符的数量。

  后面练习题要求不仅要统计a, e, i, o, u这五个字符及其大写的数量。练习题还要求统计出空格,制表符, 换行符的数量。这里我百度搜了很久都没有搜到符合我心意的答案。这道题难的地方在于,我们之前学习的std::cin无法读入空白字符。关于这个问题,其实使用getline来读取字符串即可解决问题。但是getline虽然会读入换行符,但是再读入string对象的时候会丢弃换行符。我看百度的很多做法都没有解决换行符的问题。但是其实换行符这个问题很简单。只要getline返回了,就说明用户输入了换行符,或输入的EOF。而输入了EOF会得到一个0。因此我们只需要将getline放到while循环的判断中,如果getline返回了0,就跳出循环。如果getline没有返回0,就进入循环体。但是由于getline返回是因为用户输入了换行符。所以当getline一返回就意味着用户输入了换行符。这时候直接将计算换行符的变量递增即可计算出用户输入的换行符。不过由于使用了getline作为输入,所以结束输入就要输入一个EOF才能跳出循环。上代码:

#include <iostream>
#include <string>

int main()
{
    std::string userInput("");
    int enter, table, space;
    enter = table = space = 0;

    while (getline(std::cin, userInput))
    {
        enter++;
        for (auto i : userInput)
        {
            switch (i)
            {
                case 0x09: table++;break;
                case 0x20: space++;break;
            }
        }
    }
    std::cout << "enter: " << enter << std::endl;
    std::cout << "space: " << space << std::endl;
    std::cout << "table: " << table << std::endl;
    return 0;
}

 

[C++]C++ Primer中练习5.11的想法

标签:com   答案   eof   lan   input   nbsp   学习   auto   size   

原文地址:https://www.cnblogs.com/DouglasLuo/p/13221356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!