c++ - 挣扎于文本计数器

标签 c++ string

我试着给自己写了一个文本计数器,它告诉我一段文本中有多少个字符和单词。每次我尝试粘贴一段很长的文本让它计数时,它都会崩溃或随机显示一些东西。

有人有什么建议吗?

这是我写的:

#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 longunsigned long long但是double用于浮点值。
  • 在遍历序列时,您应该在处理索引时使用无符号整数类型,例如 unsigned intstd::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-8ISO-Latin-1使用编码。

关于c++ - 挣扎于文本计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829039/

相关文章:

c++ - 为什么 '==' 在 std::string 上很慢?

c++ - 如何在Win32 C++中进行打印预览?

python - 使用 f 字符串替换字符串中的单词

C++ 将字符从 int append 到 std::string

C++ - 克隆到 vector 中

c++ - 即使为其相关的 dll 正确生成了 lib 文件,CMake 生成的 MSVC 项目也找不到符号

c++ - 检索当前/自己的包的路径

java - 在 Java 中处理 TAB 字符

c++ - 关注一个字符串转换函数

我可以更改之前在 C 中声明的变量的数据类型吗?