Почему эти две программы дают разные результаты в VC++2008?

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

person user366312    schedule 08.12.2011    source источник
comment
может быть, дайте нам вывод, чтобы нам не пришлось гадать?   -  person Dan    schedule 08.12.2011
comment
См.: msdn.microsoft.com/en- us/library/eywx8zcx%28v=VS.90%29.aspx   -  person Will Bickford    schedule 08.12.2011
comment
Также beej.us/guide/bgc/output/html/multipage/strcmp .html   -  person Will Bickford    schedule 08.12.2011


Ответы (2)


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

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

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

person Reed Copsey    schedule 08.12.2011

Из стрнкмп:

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

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

person Dan    schedule 08.12.2011