4

これら2つのプログラムがVC++2008で異なる出力を提供するのはなぜですか?

結局のところ、同じ文字列が比較されます。

strcmp__usage.c

#include <stdio.h>
#include <string.h>

main() 
{
char targetString[] = "klmnop";

printf ("Compare = %d\n", strcmp(targetString, "abcdef"));
printf ("Compare = %d\n", strcmp(targetString, "abcdefgh"));
printf ("Compare = %d\n", strcmp(targetString, "jlmnop"));
printf ("Compare = %d\n", strcmp(targetString, "klmnop"));
printf ("Compare = %d\n", strcmp(targetString, "klmnoq"));
printf ("Compare = %d\n", strcmp(targetString, "uvwxyz"));
printf ("Compare = %d\n", strcmp(targetString, "xyz"));
}

出力

Compare = 1
Compare = 1
Compare = 1
Compare = 0
Compare = -1
Compare = -1
Compare = -1

strncmp_usage.c

#include <stdio.h>
#include <string.h>

main() 
{   
    char targetString[] = "klmnopqrstuvwxyz";   
    int n = 6;

    printf ("Compare = %d\n", strncmp(targetString, "abcdef", n));
    printf ("Compare = %d\n", strncmp(targetString, "abcdefgh", n));
    printf ("Compare = %d\n", strncmp(targetString, "jlmnop", n));
    printf ("Compare = %d\n", strncmp(targetString, "klmnop", n));
    printf ("Compare = %d\n", strncmp(targetString, "klmnoq", n));
    printf ("Compare = %d\n", strncmp(targetString, "uvwxyz", n));
    printf ("Compare = %d\n", strncmp(targetString, "xyz", n));
}

出力

Compare = 10
Compare = 10
Compare = 1
Compare = 0
Compare = -1
Compare = -10
Compare = -13
4

2 に答える 2

3

strcmpstrncmpはどちらも、結果に次のものが含まれることを保証します。

ゼロ値は、両方の文字列が等しいことを示します。ゼロより大きい値は、一致しない最初の文字の値がstr2よりもstr1の方が大きいことを示します。また、ゼロ未満の値はその逆を示します。

返される実際の数(1/-1または12/-13)は実装固有であり、任意の値にすることができます。重要なのは、両方が0、ゼロ未満、またはゼロより大きいことを返すことだけです。その点で、彼らは同じ答えを提供します。

于 2011-12-08T05:45:25.020 に答える
2

strncmpから:

文字列間の関係を示す整数値を返します。ゼロ値は、両方の文字列で比較された文字がすべて等しいことを示します。ゼロより大きい値は、一致しない最初の文字の値がstr2よりもstr1の方が大きいことを示します。また、ゼロ未満の値はその逆を示します。

明らかに、strcmpは等しくない文字に対して常に1または-1を返しますが、strncmpは等しくない文字間の差を返します。その動作は未定義なので、問題はありません。

于 2011-12-08T05:46:55.917 に答える