当p指向一个字符时,strcmp(p,“\ n”)是不确定的行为吗?

时间:2015-10-12 14:54:10

标签: c string pointers c99 undefined-behavior

检查前一点:

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

是不确定的行为?或者它是完全错误的(即它总是返回不相等)?无论是什么,请解释原因!

4 个答案:

答案 0 :(得分:5)

这是UB的原因很简单,p不是以空字符结尾的字符串,如果输入非空终止字符串,则strcmp为UB。

答案 1 :(得分:4)

它是未定义的,所以所有的赌注都是关闭的,但除非你有一个非常奇特的C实现,结果可能取决于在内存中跟随char的任何事情。

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

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

或者,确实如此:

p[0] == '\n'

答案 2 :(得分:2)

是的,它将是未定义的。

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

p不满足于此。 "\n"确实如此。

答案 3 :(得分:1)

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

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

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

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

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