C++ 使用while计算空格、制表符和新行(cin>;)

C++ 使用while计算空格、制表符和新行(cin>;),c++,tabs,lines,spaces,C++,Tabs,Lines,Spaces,我的程序在计算用户发送到流的字符串中的每个符号时遇到了问题。它统计辅音、元音、“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

我的程序在计算用户发送到流的字符串中的每个符号时遇到了问题。它统计辅音、元音、“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 aCnt=0,eCnt=0,iCnt=0,oCnt=0,uCnt=0,
辅音cnt=0;
int ffCnt=0,flCnt=0,fiCnt=0;
int spaceCnt=0,newlCnt=0,tabCnt=0;
字符*检查=新字符[100];
同时(cin>>检查){
对于(int-ix=0;ix使用GETSH()或在现代C++编译器GETSX()中< /P>
#包括“iostream”
使用名称空间std;
int main(){
charx[20];
获取_s(x);
对于(int i=0;i<20;i++){
如果(x[i]==''){
库特

您可以使用此基本格式从std::cin或任何其他输入流逐行读取字符串。std::getline将通过“\n”自动标记,以便您可以从-1开始换行计数(假设您至少获得一行)然后在字符串上循环并计算所需的任何字符。

使用std::string。使用std::getline读取该行。不要使用类似strlen的函数。好的,我稍后会尝试。谢谢!谢谢您的帮助!:)
#include "iostream"
using namespace std;
int main() {
    char x[20];
    gets_s(x);
    for (int i = 0; i < 20; i++) {
        if (x[i] == ' ') {
            cout << i;
        }
    }
    system("pause");
    return 0;
}
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++;
    }
}