【问题标题】:I can check if a string is null-terminated but not check it isn't yet null terminated我可以检查一个字符串是否以 null 结尾,但不能检查它是否还没有以 null 结尾
【发布时间】:2017-05-08 09:15:29
【问题描述】:

为了让我更好地理解 C++ 字符串、数组和指针;我想知道:为什么我可以使用一个条件来检查索引是否达到了这样的空终止字符...

const char* myString = "Grandopolous";
for (int i = 0;;i++)
{
    if (!myString[i])
        break;
    else
        cout << myString[i];
}

所以效果很好。在这里,我改为检查字符是否等于空终止字符以外的字符,因此我希望如果不等于结果不应该为 0,并且条件应该为真。但这不起作用,我根本无法理解为什么:

const char* myString = "Grandopolous";
for (int i = 0;;i++)
{
    if (myString[i])
        cout << myString[i];
}

这在我的机器上不起作用并崩溃,它还会输出许多混合了奇怪符号的不可读错误消息。我认为这部分并不重要,尽管这是第一次将错误打印到我的控制台应用程序而不是调试控制台。

我提到指针的原因是因为我设法使用指针而不是数组索引语法来使条件工作,我发现它更容易阅读。

所以有人可以帮我理解为什么我的第一段代码是有效的,为什么我的第二段不是。

【问题讨论】:

  • 想想这个循环应该如何终止。第一个代码示例中的任何内容都会停止循环吗?第二个呢?
  • 你永远不会退出循环
  • c++:使用std::string...
  • 请养成使用比“它不起作用”更多的描述性短语来描述您的问题的习惯
  • 投票结束为“简单的印刷错误”。这个问题及其答案不太可能对未来的用户有所帮助。

标签: c++ string pointers null-terminated


【解决方案1】:

确实工作。检查 null 不是问题。

你的程序崩溃了,因为你摆脱了break,所以你的程序超出了数组,然后永远继续下去。

您的调试器肯定会在您逐步执行程序时向您揭示这一点,观察i

要颠倒第一个示例的逻辑,请编写:

const char* myString = "Grandopolous";
for (int i = 0;;i++)
{
    if (myString[i])
        cout << myString[i];
    else
        break;
}

【讨论】:

  • 哦,谢谢你,我很困惑,我知道我做的事情一定很愚蠢。
  • 甚至(在这种情况下)将测试移到它所属的位置:for (int i = 0; myString[i]; ++i) { std::cout &lt;&lt; myString[i]; }
  • 谢谢,这真的是我从未想过的事情,我将来会这样做。 @TobySpeight
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2022-01-25
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多