如何编程来查找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;
}
答案 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;
}
在上面的程序中,我使用switch
与if-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。