程序,以查找空格和换行符的数量

时间:2014-04-12 15:37:38

标签: c++

如何编程来查找c ++中的空格和换行符的数量? 那就是我到目前为止......

#include <iostream.h>
#include <string.h>

int main()
{
  int i;
  int w = 0;
  char a[] = {' ', '\n'};
  char x[30],z[30];

  for (int i = 0 ; i <= 30;i++)
    cin >> x[i];

  for (int j = 0 ; j < 30; j++) {
    for (int k = 0 ; k < 2; k++) {
      x[j] == a[k];
      if (x[j] == ' ')
        w++;
    }
  }

  cout << w << endl;
  system("pause");
  return  0;
}

2 个答案:

答案 0 :(得分:1)

以下是显示基本算法的示例。正如其他人所评论的那样,有更简单有效的方法。

int main(void)
{
  char c;
  unsigned int space_quantity = 0;
  unsigned int newline_quantity = 0;
  while (cin >> c) // Read in the character.
  {
    switch (c)
    {
      case ' ':  //  Check for space.
        ++space_quantity;
        break;

      case '\n':  // Check for newline.
        ++newlines;
        break;

      default:  // Don't do anything for other characters.
        break;
    }
  }
  cout << "Spaces: " << space_quantity << '\n';
  cout << "Newlines: " << newline_quantity << '\n';
  return EXIT_SUCCESS;
}

在上面的程序中,我使用switchif-else-if,因为我认为它看起来更具可读性。您可能没有了解switch语句,因此您可以使用多个if语句来检查字符。同样的意图;可能相同的可执行代码和性能。

编辑1:使用数组
通过为每个输入请求读取多个字符,数组可以提高I / O的性能。通过内存搜索比从输入源(不是内存作为输入源)读取要快得多。

如果必须使用数组,以下是使用数组的示例。通常,由于用户响应缓慢,数组不会与cin一起使用。

#define ARRAY_CAPACITY 128

int main(void)
{
  char c;
  unsigned int space_quantity = 0;
  unsigned int newline_quantity = 0;
  char         buffer[ARRAY_CAPACITY];
  while (cin.read(buffer, ARRAY_CAPACITY))
  {
     // Need to get the number of characters
     // actually read into the buffer.
     const unsigned int characters_read = cin.gcount();

     // Process each character from the buffer.
     for (unsigned int i = 0; i < characters_read; ++i)
     {
       switch (c)
       {
         case ' ':  //  Check for space.
           ++space_quantity;
           break;

         case '\n':  // Check for newline.
           ++newlines;
           break;

         default:  // Don't do anything for other characters.
           break;
       } // End: switch
     } // End: for
  } // End: while
  cout << "Spaces: " << space_quantity << '\n';
  cout << "Newlines: " << newline_quantity << '\n';
  return EXIT_SUCCESS;
}

答案 1 :(得分:0)

现在,当您接受解决方案时,我将在现代C ++中使用C++ standard library的帮助向您展示最简单,最简单的方法:

#include <iostream>
#include <iterator>

int main()
{
    int spaces_and_newlines = 
        std::count_if(
            std::istream_iterator<char>(std::cin),
            std::istream_iterator<char>(),
            [](const char& ch) { return (ch == ' ' || ch == '\n'); });
    std::cout << "Number of spaces and newlines: " << spaces_and_newlines << '\n';
}

参考文献:

除lambda表达式之外的所有内容都是C ++ 03标准的一部分,所有现代(而不是那么现代)的编译器都支持这种标准。 Lambda表达式是C ++ 11中的新增功能,并且受到所有现代和流行的C ++编译器的支持(GCC 4.8,Clang 3.4,VisualC ++ 2013(我认为所有这些编译器的先前版本也支持它),其他最高版本日期编译器(如英特尔ICC)也应该支持它。)

但是: 此代码存在问题,您的代码也存在问题:使用输入运算符从文本输入流(如std::cin)读取时>>(或像我一样使用输入迭代器)流 跳过所有空格 ,其中包括空格和换行符。因此,您的原始和我的解决方案不能用于此,至少不能用于空格。这就是为什么你必须使用std::istream::read来读取字符的原因,因为它不会跳过空格。


我在撰写答案时并没有想到它,但是可以使用我的程序,但是您可以使用std::istreambuf_iterator而不是std::istream_iterator。或clear the skipws flag