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