当 p 指向一个字符时,strcmp(p, "\n") 是未定义的行为吗?
Is strcmp(p, "\n") undefined behavior when p points to a character?
检查最小值:
#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;
}
这是未定义的行为吗?或者它只是错误的(即它总是 return 不相等)?不管是什么,请解释原因!
它是 UB 的原因很简单,p
不是空终止字符串,strcmp
如果输入非空终止字符串是 UB。
是的,它将是未定义的。
strcmp
需要两个字符序列;每个 终止 与 [=11=]
.
p
不满足。 "\n"
确实如此。
它是未定义的,所以所有的赌注都不成立,但除非你有一个非常奇特的 C 实现,否则结果可能取决于内存中 char 后面发生的任何事情。
你可以像这样做你想做的事:
strncmp(p, "\n", 1) == 0
或者,确实,像这样:
p[0] == '\n'
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 为零的所有情况下都会定义行为,
但不是在两者都持有非零值的情况下。
检查最小值:
#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;
}
这是未定义的行为吗?或者它只是错误的(即它总是 return 不相等)?不管是什么,请解释原因!
它是 UB 的原因很简单,p
不是空终止字符串,strcmp
如果输入非空终止字符串是 UB。
是的,它将是未定义的。
strcmp
需要两个字符序列;每个 终止 与 [=11=]
.
p
不满足。 "\n"
确实如此。
它是未定义的,所以所有的赌注都不成立,但除非你有一个非常奇特的 C 实现,否则结果可能取决于内存中 char 后面发生的任何事情。
你可以像这样做你想做的事:
strncmp(p, "\n", 1) == 0
或者,确实,像这样:
p[0] == '\n'
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 为零的所有情况下都会定义行为, 但不是在两者都持有非零值的情况下。