我想知道何时指定" 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;
}
答案 0 :(得分: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
。