首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为啥无法统计空格、制表键和换行符的数目

2013-10-07 
为什么无法统计空格、制表键和换行符的数目?就是这个程序,不管你怎么输入,最后三项的数值都是0.怎么回事呢?

为什么无法统计空格、制表键和换行符的数目?
就是这个程序,不管你怎么输入,最后三项的数值都是0.怎么回事呢?


#include <iostream>
using std::cin;
using std::cout;
using std::endl;
void keep_window_open();

int main()
{
char ch;
// initialize counters for each vowel
unsigned aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0, spcCnt=0, tabCnt=0,newlineCnt=0;

while(cin>>ch)
{
//if ch is a vowel, increment the appropriate counter
switch (ch)
{
case 'a':case 'A': ++aCnt;break;
case 'e':case 'E': ++eCnt;break;
case 'i':case 'I': ++iCnt;break;
case 'o':case 'O':++oCnt;break;
case 'u':case 'U':++uCnt;break;
case ' ':++spcCnt;break;
case '\t':++tabCnt;break;
case '\n':++newlineCnt;break;
default:break;
}
}

// print results
cout << "\nNumber of vowel a:\t"<<aCnt <<endl
 << "Number of vowel e:\t"<<eCnt <<endl
 << "Number of vowel i:\t"<<iCnt <<endl
 << "Number of vowel o:\t"<<oCnt <<endl
 << "Number of vowel u:\t"<<uCnt <<endl
 << "Number of space:\t"<<spcCnt <<endl
 << "Number of tab:\t"<<tabCnt <<endl
 << "Number of newline:"<<newlineCnt <<endl;

keep_window_open();
}

void keep_window_open()
{
cout << "\nPress any key to exit:";
getchar();
}
空格 switch
[解决办法]
引用:
回车实际上是两个字符,ch只能接收一个
不对 /r/n这个底层细节 被屏蔽了 
cin来说 按下回车就接受到\n
[解决办法]
cin>> 不接受空白字符 
[解决办法]
cin 使用空白(空格、制表符和换行符)来定字符的界。
在cin>>char 的时候,cin将忽略空格和换行符。
[解决办法]
while((ch=getchar())!=eof)

如果我没记错的话,k&r里有这个例子,不过那个是统计的总字数
[解决办法]
cin.get() 一次读取一个字符,且不忽略任何空白。

code:

#include <iostream>
using namespace std;

int main()
{
    char c;
    int count[8] = {};
    while ((c = cin.get()) != EOF)
    {
        switch(c)
        {
            case 'a':
            case 'A':
                count[0]++;
                break;
            case 'e':
            case 'E':
                count[1]++;
                break;
            case 'i':
            case 'I':
                count[2]++;
                break;
            case 'o':
            case 'O':
                count[3]++;
                break;
            case 'u':
            case 'U':
                count[4]++;
                break;
            case ' ':


                count[5]++;
                break;
            case '\t':
                count[6]++;
                break;
            case '\n':
                count[7]++;
                break;
            default:
                break;
        }
    }
    for (int i = 0, len = sizeof count / sizeof count[0];
            i < len; ++i)
    {
        cout << count[i] << endl;
    }
    return 0;
}

热点排行