Почему эти две программы дают разные результаты в VC ++ 2008? - PullRequest
4 голосов
/ 08 декабря 2011

Почему эти две программы дают разные результаты в 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

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Обе strcmp и strncmp обеспечивают гарантию того, что результат будет включать:

Нулевое значение означает, что обе строки равны.Значение больше нуля указывает, что первый не соответствующий символ имеет большее значение в str1, чем в str2;И значение меньше нуля указывает на обратное.

Фактическое возвращаемое число (1 / -1 или 12 / -13) зависит от реализации и может быть любым значением.Единственное значение имеет то, что оба возвращают 0, меньше нуля или больше нуля.В этом отношении они дают один и тот же ответ.

2 голосов
/ 08 декабря 2011

Из strncmp:

Возвращает целое значение, указывающее взаимосвязь между строками: нулевое значение указывает, что все сравниваемые символы в обеих строках равны.Значение больше нуля указывает, что первый не соответствующий символ имеет большее значение в str1, чем в str2;И значение меньше нуля указывает на обратное.

Очевидно, что strcmp всегда возвращает 1 или -1 для неравных символов, тогда как strncmp возвращает разницу между неравными символами.Поскольку это поведение не определено, это не проблема.

...