【问题标题】:Is strcmp(p, "\n") undefined behavior when p points to a character?当 p 指向一个字符时,strcmp(p, "\n") 是未定义的行为吗?
【发布时间】:2015-10-12 14:54:09
【问题描述】:

检查最小值:

#include <stdio.h>
#include <string.h>

int main(void) {
    char newline = '\n';
    char* p = &newline;
    if(strcmp(p, "\n") == 0) {
        printf("ok\n");
    } else {
        printf("wrong\n");
    }
    return 0;
}

这是未定义的行为吗?或者它只是错误的(即它总是返回不相等)?不管是什么,请解释原因!

【问题讨论】:

标签: c string pointers c99 undefined-behavior


【解决方案1】:

它是 UB,原因很简单,p 不是以 null 结尾的字符串,而 strcmp 如果输入非以 null 结尾的字符串,则为 UB。

【讨论】:

    【解决方案2】:

    它是未定义的,所以所有的赌注都没有,但除非你有一个非常奇特的 C 实现,否则结果可能取决于内存中 char 之后发生的任何事情。

    你可以像这样做你想做的事:

    strncmp(p, "\n", 1) == 0
    

    或者,确实是这样的:

    p[0] == '\n'
    

    【讨论】:

    • 我看到评论,我觉得这是一个非常非常糟糕的问题,因此应该删除它。请您删除您的答案,以便我删除它吗?
    • 这是一个糟糕的问题吗?很清楚,它带有一个例子,答案可能对其他人有所帮助。
    • 嗯,这是微不足道的,但我没能看到答案,只是因为我有太多时间写 C。你也可以在 -2 分数中看到它。你不同意吗?
    • @chux 没错,但相关性不足以让新手感到困惑。
    • @chux 现在开心吗?我不确定它是否更清楚,但它说明了我的意思,没有隐藏任何内容。
    【解决方案3】:

    是的,它将是未定义的。

    strcmp 需要两个字符序列;每个\0终止

    p 不满足这一点。 "\n" 会。

    【讨论】:

    • 谢谢! nullptr 是否存在于 C 中?
    • C 中没有 nullptr 这样的东西。终止字符是 ASCII NUL(不要与 NULL 宏混淆)。
    • 糟糕。需要停止使用 C++ 编程一段时间。而且,绝对地,@Jens 对 NUL 和 NULL 进行了非常重要的区分。
    【解决方案4】:

    strcmp(p1,p2) 的行为仅在 p1 标识包含零字节的可访问内存范围的开始的情况下定义,并且 p2 也是如此。的行为

    int foo(int bar)
    {
      char b=bar;
      return strcmp(&b, "Moo");
    }
    

    将在 'bar' 为零的情况下完全定义(空字符串 将需要比较小于非空字符串文字)但是 在所有其他情况下未定义。如果代码是:

    int foo(int bar, int boz)
    {
      char arr[2];
      arr[0] = bar; arr[1] = boz;
      return strcmp(arr, "Moo");
    }
    

    然后在 bar 或 boz 为零的所有情况下都将定义行为, 但不是在两者都持有非零值的情况下。

    【讨论】:

    • @gsamaras:这样更好吗?
    猜你喜欢
    • 2011-04-04
    • 2017-12-16
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多