使用 while ( cin >> ) 计算空格、制表符和新行
Counting spaces, tabs and new lines using while ( cin >> )
我的程序有问题,它应该计算用户发送到流的字符串中的每个符号。它计算辅音、元音、'ff'、'fl'、'fi' 和 '\t'、'\n' 和 ' '。问题是该程序运行良好,但仍然不计算空格、制表符和换行符。我试过使用 noskipws 操纵器,但直到第一个词它才读取任何内容。
这里是:
int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0,
consonantCnt=0;
int ffCnt = 0, flCnt = 0, fiCnt = 0;
int spaceCnt = 0, newlCnt = 0, tabCnt = 0;
char *check = new char[100];
while ( cin >> check ) {
for ( int ix = 0; ix < strlen(check); ++ix ) {
switch ( check[ix] ) {
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 ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newlCnt;
break;
default:
if ( isalpha( check[ix] ) )
++consonantCnt;
break;
}
if ( check[ix] == 'f' ) {
++ix;
switch ( check[ix] ) {
case 'f':
++consonantCnt;
++ffCnt;
break;
case 'i':
++fiCnt;
++iCnt;
break;
case 'l':
++consonantCnt;
++flCnt;
break;
case 'I':
++iCnt;
break;
case 'a': case 'A':
++aCnt;
break;
case 'e': case 'E':
++eCnt;
break;
case 'o': case 'O':
++oCnt;
break;
case 'u': case 'U':
++uCnt;
break;
case ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newlCnt;
break;
default:
if ( isalpha( check[ix] ) )
++consonantCnt;
break;
}
}
}
}
delete [] check;
cout << "Встретилась a: \t" << aCnt << '\n'
<< "Встретилась e: \t" << eCnt << '\n'
<< "Встретилась i: \t" << iCnt << '\n'
<< "Встретилась o: \t" << oCnt << '\n'
<< "Встретилась u: \t" << uCnt << '\n'
<< "Встретилось согласных: \t" << consonantCnt << '\n'
<< "Встретилось fl: \t" << flCnt << '\n'
<< "Встретилось fi: \t" << fiCnt << '\n'
<< "Встретилось ff: \t" << ffCnt << '\n'
<< "Встретилось символов табуляции: \t" << ffCnt << '\n'
<< "Встретилось символов пробела: \t" << ffCnt << '\n'
<< "Встретилось символов новой строки: \t" << ffCnt << '\n'
<< '\n';
int tabCount = 0, spaceCount = 0, newlineCount = -1;
while(std::getline(std::cin, line)){ //getline reads in a line to a string tokenized by \d by default
newlineCount++; //every time there's a new loop, theres a new newline.
for(auto c : line) {
if(c == '\t')
tabCount++;
else if(c == ' ')
spaceCount++;
}
}
您可以使用这种基本格式从 std::cin 或任何其他输入流中逐行读取字符串。 std::getline 将通过 '\n' 自动标记化,因此您可以从 -1 开始换行计数(假设您至少得到一行)并遍历您的字符串并计算您想要的任何字符。
我的程序有问题,它应该计算用户发送到流的字符串中的每个符号。它计算辅音、元音、'ff'、'fl'、'fi' 和 '\t'、'\n' 和 ' '。问题是该程序运行良好,但仍然不计算空格、制表符和换行符。我试过使用 noskipws 操纵器,但直到第一个词它才读取任何内容。
这里是:
int aCnt=0, eCnt=0, iCnt=0, oCnt=0, uCnt=0,
consonantCnt=0;
int ffCnt = 0, flCnt = 0, fiCnt = 0;
int spaceCnt = 0, newlCnt = 0, tabCnt = 0;
char *check = new char[100];
while ( cin >> check ) {
for ( int ix = 0; ix < strlen(check); ++ix ) {
switch ( check[ix] ) {
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 ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newlCnt;
break;
default:
if ( isalpha( check[ix] ) )
++consonantCnt;
break;
}
if ( check[ix] == 'f' ) {
++ix;
switch ( check[ix] ) {
case 'f':
++consonantCnt;
++ffCnt;
break;
case 'i':
++fiCnt;
++iCnt;
break;
case 'l':
++consonantCnt;
++flCnt;
break;
case 'I':
++iCnt;
break;
case 'a': case 'A':
++aCnt;
break;
case 'e': case 'E':
++eCnt;
break;
case 'o': case 'O':
++oCnt;
break;
case 'u': case 'U':
++uCnt;
break;
case ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newlCnt;
break;
default:
if ( isalpha( check[ix] ) )
++consonantCnt;
break;
}
}
}
}
delete [] check;
cout << "Встретилась a: \t" << aCnt << '\n'
<< "Встретилась e: \t" << eCnt << '\n'
<< "Встретилась i: \t" << iCnt << '\n'
<< "Встретилась o: \t" << oCnt << '\n'
<< "Встретилась u: \t" << uCnt << '\n'
<< "Встретилось согласных: \t" << consonantCnt << '\n'
<< "Встретилось fl: \t" << flCnt << '\n'
<< "Встретилось fi: \t" << fiCnt << '\n'
<< "Встретилось ff: \t" << ffCnt << '\n'
<< "Встретилось символов табуляции: \t" << ffCnt << '\n'
<< "Встретилось символов пробела: \t" << ffCnt << '\n'
<< "Встретилось символов новой строки: \t" << ffCnt << '\n'
<< '\n';
int tabCount = 0, spaceCount = 0, newlineCount = -1;
while(std::getline(std::cin, line)){ //getline reads in a line to a string tokenized by \d by default
newlineCount++; //every time there's a new loop, theres a new newline.
for(auto c : line) {
if(c == '\t')
tabCount++;
else if(c == ' ')
spaceCount++;
}
}
您可以使用这种基本格式从 std::cin 或任何其他输入流中逐行读取字符串。 std::getline 将通过 '\n' 自动标记化,因此您可以从 -1 开始换行计数(假设您至少得到一行)并遍历您的字符串并计算您想要的任何字符。