使用 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 开始换行计数(假设您至少得到一行)并遍历您的字符串并计算您想要的任何字符。