2017-09-24 42 views
-3

我想了解当我指定“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'的时候,所以它会比较长度为10。但是,如果你想指定一个特定的长度来比较使用strncmp(str1,str2,length)。 –

+3

未定义的行为是未定义的。您正在将10个以上的字符(包括空字节)复制到10个字符数组中......所有投注都关闭。 –

+0

'char str1 [10];'完成。 –

回答

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 

你的假设,即strxstr1前要在内存位于不正确。当你溢出str1你改变strx

相关问题