检查前一点:
#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;
}
是不确定的行为?或者它是完全错误的(即它总是返回不相等)?无论是什么,请解释原因!
答案 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为零的所有情况下定义, 但不是在两者都保持非零值的情况下。