【问题标题】:Checking for string null terminators in C在 C 中检查字符串空终止符
【发布时间】:2021-06-12 08:00:13
【问题描述】:

我知道C中的空终止符用\0表示,数值为0。但是,当我执行下面的代码时,程序将空终止符视为%。我在网上搜索了这个,但我找不到有这个问题的人。

int main(){
    char* forward = "hello";
    int forward_length = 0;
    while (*(forward++) != '\0') {
        printf("%d\n", forward_length++);
    }
    if(*forward == '%'){
        printf("Terminator Found");
    }
}

输出是:

0
1
2
3
4
Terminator Found

显然,forward[5] 不等于字符 %。有人可以告诉我程序有什么问题吗?

【问题讨论】:

  • while (*(forward++) != '\0') 无论条件如何,这都会增加forward。当循环结束时,forward 将指向'\0' nul 终止符之后的一个,而取消引用*forwardUB
  • 写代码的人可能希望"%d" 字符串在内存中紧跟"hello",但没有这样的保证;代码依赖于未定义的行为。
  • 您对(*forward == '%') 的测试正在寻找一个超过空终止符,因为早期的空检查后增加了它。所以它相当于在原始字符串中使用索引 6,而不是 5。由于您正在索引字符串常量的空终止符,因此它是未定义的行为,并且值可以是任何值。

标签: c null-terminated


【解决方案1】:

建设离开forward 太先进了。这是因为即使循环条件为假(因为它在循环条件内),后增量也会运行。明显的固定循环如下:

   for (;*forward != '\0'; ++forward)
       printf("%d\n", forward_length++);

如果你更喜欢保留 while 循环,--forward 在 while 循环之后会修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2010-12-07
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多