在c ++中使用concat字符串时会感到困惑

时间:2012-05-30 13:25:21

标签: c++ string

我只是尝试测试如何在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];

2 个答案:

答案 0 :(得分:3)

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

删除该测试,并在循环后添加第二个std::cout << word

答案 1 :(得分: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<=key.length()。但要小心C ++ std :: string不像C-String。 key[key.length()]处的字符无效,您无权访问该字符。你应该做的是将C ++ std :: string转换为带有c_str()的C-String。

    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";
}