Почему сравнение строк в C не работает? - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть следующая программа

main()
{

    char name[4] = "sara";
    char vname[4] = "sara";

    if(strcmp(name, vname) == 0)
    {
        printf("\nOK");
    }
    else
    {
        printf("\nError");
    }

}

Эта программа всегда печатает "Ошибка" ... в чем проблема, помогите мне

но если я изменяю char vname [] = "sara", то выводится "OK" ... почему ??

Ответы [ 4 ]

20 голосов
/ 20 сентября 2011

Вы жестко настраиваете свои массивы так, чтобы они были слишком короткими для строк (они не включают в себя дополнительный символ для нулевого терминатора). В результате, при выполнении сравнения strcmp проходит через конец строк, что приводит к непредсказуемым результатам. Вам повезло, что вы не получили ошибку сегмента.

9 голосов
/ 20 сентября 2011

Простите, если это не по пути, так как я не делал C целую вечность!

main()
{
    char name[] = "sara";
    char vname[] = "sara";

    if(strcmp(name, vname) == 0)
    {
        printf("\nOK");
    }
    else
    {
        printf("\nError");
    }
}

Вы указали жесткие длины для своих массивов символов, но в C строки заканчиваются нулем, так что для "sara" фактически требуется len 5, а не 4.

8 голосов
/ 20 сентября 2011

Потому что name и vname не содержат строк. Указав для каждого из них размер 4 с 4-символьной строкой в ​​качестве инициализатора, вы указали компилятору хранить только эти 4 символа без '\0' нулевого символа, обозначающего конец строки.

Поведение не определено; вам (не) повезло, что он не просто разбился.

Удалите 4 (или измените его на 5):

char name[] = "sara";
char vname[] = "sara";

РЕДАКТИРОВАТЬ : Вот модифицированная версия вашей программы, которая исправляет несколько других проблем (см. Комментарии). Кроме пропущенных 4 в объявлениях name и vname, большинство изменений не имеют прямого отношения к вашему вопросу.

#include <stdio.h>  /* needed for printf */
#include <string.h> /* needed for strcmp */

int main(void) /* correct declaration of "main" */
{

    char name[] = "sara";   /* omit 4 */
    char vname[] = "sara";  /* omit 4 */

    if (strcmp(name, vname) == 0)
    {
        printf("OK\n");     /* \n is at the *end* of the line */
    }
    else
    {
        printf("Error\n");  /* as above */
    }

    return 0; /* not absolutely required, but good style */
}
1 голос
/ 20 сентября 2011

Это потому, что вы не выделяете достаточно места для ваших строк (4 байта могут хранить символы "sara", но не нулевой символ в конце строки.

strcmp идет по строке, пока не достигнет нулевого символа, или разницы в строках, а затем, если он достигнет нуля для обеих строк, они равны. Поскольку вы не выделяете массивы, достаточно большие для нулевого символа, в итоге две строки будут неравными. Фактически, в большинстве систем вы, вероятно, получите имя, похожее на «sarasara», а vname - просто «sara», так как vname следует сразу после имени, есть большая вероятность, что они будут сохранены в памяти и перезаписать имена nul char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...