2017-09-24 7 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'になるまで2つの文字列を比較して、長さ10まで比較します。ただし、比較する特定の長さを指定する場合は、strncmp(str1、str2、length)を使用します。 –

+3

未定義の動作は未定義です。 10文字以上(NULLバイトを含む)を10の文字配列にコピーしています...すべてのベットがオフです。 –

+0

'char str1 [10];'完了しました。 –

答えて

0

多かれ少なかれ、Antti Haapalaのコメントが参考になります。未定義の動作は未定義です。一度あなたがそれを呼び出すと、あなたはプログラムが行うかもしれないことに不平を言う権利を失います。

特に、あなたの場合、アサーションの1つが間違っています。あなたは、文字列を印刷する場合、それらは同じであると主張しました。私にとっては少なくとも、そうではありません。

#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の前に配置されていることをあなたの仮定が間違っています。 がオーバーフローすると、strxが変更されます。

関連する問題