0

我正在通过 C++ Primer 5th edition 自学 C++。我在本书的第 5 章中遇到了一个我不知道如何使用他们迄今为止给我的工具来解决的问题。我有以前的编程经验,并且自己使用noskipws. 我正在寻找有关如何以最少的库使用来解决此问题的帮助,想想初学者书籍的前 4-5 章。

问题是在使用 if 语句读取所有元音、空格、制表符和换行符时查找并计算它们。我对这个问题的解决方案是:

// Exercise 5.9
int main() 
{
char c;
int aCount = 0;
int eCount = 0;
int iCount = 0;
int oCount = 0;
int uCount = 0;
int blankCount = 0;
int newLineCount = 0;
int tabCount = 0;   
while (cin >> noskipws >> c) 
{       
    if( c == 'a' || c == 'A')
        aCount++;
    else if( c == 'e' || c == 'E')
        eCount++;
    else if( c == 'i' || c == 'I')
        iCount++;
    else if( c == 'o' || c == 'O')
        oCount++;
    else if( c == 'u' || c == 'U')
        uCount++;       
    else if(c == ' ')
        blankCount++;       
    else if(c == '\t')
        tabCount++;     
    else if(c == '\n')
        newLineCount++;     
}
cout << "The number of a's: " << aCount << endl;
cout << "The number of e's: " << eCount << endl;
cout << "The number of i's: " << iCount << endl;
cout << "The number of o's: " << oCount << endl;
cout << "The number of u's: " << uCount << endl;
cout << "The number of blanks: " << blankCount << endl;
cout << "The number of tabs: " << tabCount << endl;
cout << "The number of new lines: " << newLineCount << endl;    
return 0;
}

我能想到解决这个问题的唯一另一种方法是使用 getline() 然后计算它循环的次数以获得“/n”计数,然后逐步遍历每个字符串以找到“/t”和“”。

提前感谢您的帮助。

4

2 回答 2

5

noskipws您可以通过替换它来避免

while (cin >> noskipws >> c) 

while ( cin.get(c) ) 

提取运算符>>遵守分隔符规则,包括空格。

istream::get没有,并逐字提取数据。

于 2013-03-19T21:24:39.413 回答
0

您的代码运行良好

输入:

This is a test or something
New line
12345
Test 21

输出:

The number of a's: 1
The number of e's: 5
The number of i's: 4
The number of o's: 2
The number of u's: 0
The number of blanks: 7
The number of tabs: 0
The number of new lines: 3

我建议检查std::tolower () 函数,以同时测试大写和小写字符。此外,要检查任何类型的字母,请查看std::isalpha () 、 std::isdigit ()、std::isspace () 和类似函数。

此外,您可以使函数不依赖于 std::cin,而是使用 std::cin 获取字符串,并将字符串传递给函数,这样该函数就可以用于任何字符串,而不仅仅是 std: :cin 输入。

为了避免使用noskipws(我个人认为这很好),一个选择是这样做:(作为已经提供的其他解决方案的替代选项)

std::string str;
//Continue grabbing text up until the first '#' is entered.
std::getline(cin, str, '#');
//Pass the string into your own custom function, to keep your function detached from the input.
countCharacters(str); 

(见这里的例子

于 2013-03-19T21:23:49.000 回答