【问题标题】:Counting spaces, tabs and new lines using while ( cin >> )使用 while ( cin >> ) 计算空格、制表符和换行符
【发布时间】:2017-11-04 19:40:38
【问题描述】:

我的程序有问题,我应该计算用户发送到流的字符串中的每个符号。它计算辅音,元音,'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';

【问题讨论】:

  • 使用 std::string。使用 std::getline 读取该行。不要使用 strlen 之类的函数。
  • 好的,我稍后再试试。谢谢!

标签: c++ tabs lines spaces


【解决方案1】:
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 开始换行计数(假设您至少获得一行)并遍历您的字符串并计算您想要的任何字符。

【讨论】:

  • 感谢您的帮助! :)
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多