我试着给自己写了一个文本计数器,它告诉我一段文本中有多少个字符和单词。每次我尝试粘贴一段很长的文本让它计数时,它都会崩溃或随机显示一些东西。
有人有什么建议吗?
这是我写的:
#include <iostream>
#include <string>
using namespace std;
int main()
{
cout << "Text counter\nPlease insert text.\n";
string text = "";
getline(cin, text);
double countTotal = text.size();
cout << "Total characters: " << countTotal << "\n";
int wordCount = 1;
for (int chrSearch = 0; chrSearch < (int)text.size(); chrSearch++)
{
char chr = text.at(chrSearch);
if(chr == ' ')
{
wordCount++;
}
}
cout << "Total words: " << wordCount << "\n";
return 0;
}
最佳答案
首先,代码最多读取一行:std::getline(std::cin, line)
收到第一个换行符后停止阅读。您可以指定停止位置的字符,例如字符 '\0'
不太可能出现在典型文本中。例如,您可以使用:
std::string text;
if (std::getline(std::cin, text, '\0')) {
// do something with the read text
}
您还应该始终检查输入是否成功。虽然上面的方法适用于短文本,但当文本变大时,一次读取一行更有意义,最终当到达流的末尾时读取一行将失败。
如果您不喜欢读取空字符之前的所有内容的方法,您可以使用如下代码读取整个流:
std::istreambuf_iterator<char> it(std::cin), end;
std::string text(it, end);
if (!text.empty()) {
// do something with the read text
}
关于代码其他部分的几点说明:
- 不要使用
double
你的意思是使用整数。您可能想使用更大的整数,例如unsigned long
或unsigned long long
但是double
用于浮点值。 在遍历序列时,您应该在处理索引时使用无符号整数类型,例如
unsigned int
或std::size_t
.这样就不需要投size()
.您最好使用迭代器:for (auto it(text.begin()), end(text.end()); it != end; ++it) { char chr(*it); // ... }
或
for (char chr: text) { // ... }
请注意,如果有两个连续的空格,则您的字数统计是错误的。此外,如果您不使用换行符来打断文本,则需要使用
'\n'
作为分隔单词的附加空白字符。如果你想考虑所有空格,你实际上应该使用这样的东西来确定一个字符是否是一个空格:if (std::isspace(static_cast<unsigned char>(chr)) { ... }
static_cast<unsigned char>(chr)
需要因为char
倾向于签名并使用std::isspace()
的负值导致未定义的行为。将字符转换为unsigned char
避免任何问题。请注意,负数字符并非完全不常见:例如,我姓氏的第二个字符(u-umlaut'ü'
)通常会导致负数char
,例如,当 UTF-8或 ISO-Latin-1使用编码。
关于c++ - 挣扎于文本计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829039/