我无法理解为什么字符串比较结果显示为假阴性?
问题描述:
我想了解当我指定“strx”的值超过10个字符时,它总是会导致strcmp显示-1的值,而当我指定strx的值小于10个字符时,则strcmp会显示正确的值为0.我无法理解为什么字符串比较结果显示为假阴性?
我的具体问题是:如果我们指定的strx的值大于str1的大小,为什么strcmp会放弃-1的错误结果? PS:我试图在复制后打印str1和strx,并显示相同的输出。
#include <stdio.h>
#include <string.h>
int main()
{
char strx[]="123456789101112";
char str1[10];
strcpy(str1,strx);
int ret;
ret = strcmp(str1,strx);
printf("%d\n", ret);
if(ret == 0)
{
printf("Intact. Try Again\n");
printf("Str1 = %s\n",str1);
}
else
{
printf("Overflow successful\n");
}
return 0;
}
答
Antti Haapala的评论或多或少总结了它。未定义的行为是未定义的。一旦你调用它,你就失去了抱怨程序可能做的其他事情的权利。
特别是,在你的情况下,你的一个断言是错误的。你声称,如果你打印字符串,他们是相同的。至少对我来说,这是不是这样的:
#include <stdio.h>
#include <string.h>
int main()
{
char strx[]="123456789101112";
char str1[10];
strcpy(str1,strx);
printf("%s\n", strx);
printf("%s\n", str1);
int ret;
ret = strcmp(str1,strx);
printf("%d\n", ret);
if(ret == 0)
{
printf("Intact. Try Again\n");
printf("Str1 = %s\n",str1);
}
else
{
printf("Overflow successful\n");
}
return 0;
}
,打印:
01112
123456789101112
1
Overflow successful
你的假设,即strx
是str1
前要在内存位于不正确。当你溢出str1
你改变strx
。
我不明白这个问题,它会一直比较两个字符串,直到字符串命中'\ 0'的时候,所以它会比较长度为10。但是,如果你想指定一个特定的长度来比较使用strncmp(str1,str2,length)。 –
未定义的行为是未定义的。您正在将10个以上的字符(包括空字节)复制到10个字符数组中......所有投注都关闭。 –
'char str1 [10];'完成。 –