0

我只是尝试测试如何在 C++ 中拆分单词,但遇到了非常未知的错误。这个问题真的让我发疯,我不知道为什么会这样。

这是我的代码:

std::string key = "hello world";
std::string word = "";

for (int i = 0; i < (int)key.length(); i++)
{
    if (std::isspace(key[i]) || key[i] == '\0')
    {
        std::cout << word << "\n";
        word.clear();
    }
    else
        word += key[i];
}

结果只是“你好”,我试图调试并弄清楚为什么在isspace条件之后停止连接这个词?那么有人可以请我指出正确的方向吗?

谢谢

编辑:尝试了以下,现在它到底缺少字母d?

    if (std::isspace(key[i]) || key[i + 1] == '\0')
    {

编辑2:解决了这个问题:

    if (std::isspace(key[i]) || key[i + 1] == '\0')
    {
        if (key[i + 1] == '\0')
            word += key[i];
4

2 回答 2

3

key[j] == 0永远不会发生,字符串长度不计算终止 0,所以最后一个单词永远不会被打印出来。

删除该测试,并std::cout << word在循环后添加一秒钟。

于 2012-05-30T13:29:28.760 回答
3

为什么它不起作用

因为这个条件永远不会满足:

key[i] == '\0'

因为j总是小于 key.length() 并且(理论上)'\0' 字符应该在 key[key.length()] 你永远不会到达它,因此不会打印出第二个单词。

您将密钥更改为:

std::string key = "hello world again";

你会看到它打印

hello
world

但它不会打印again

从 C 的角度来看

C-String(不是 C++ std::string)以 '\0' 终止
因此,如果您想继续沿当前路径查找 '\0' 字符,则需要使用 C-Strings。

为此,您可以将for()其更改j为. 但要小心 C++ std::string 不像 C-String。at 的字符无效,您无权访问它。您应该做的是将 C++ std::string 转换为带有.<=key.length()key[key.length()]c_str()

    char tmp = key.c_str()[j];
    if (std::isspace(tmp) || tmp == '\0')

或者

您可以在循环后打印单词(如果它不为空)

std::string key = "hello world";
std::string word = "";

for (int j = 0; j < (int)key.length(); j++)
{ 

     if (std::isspace(key[j]) || key[i] == '\0')
     {
           std::cout << word << "\n";
           word.clear();
     }
     else
           word += key[j];
}
if (!word.empty())
{    std::cout << word << "\n";
}
于 2012-05-30T13:37:52.410 回答