我无法理解为什么字符串比较结果显示为假阴性?

时间:2017-09-24 01:51:17

标签: c buffer overflow strcmp

我想知道何时指定" 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;
}

1 个答案:

答案 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