Сравнение двух строк, проблемы с strcmp

Я пытаюсь проверить, начинается ли строка, прочитанная из stdin, с «login:», но strcmp, похоже, не работает.

char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n");

Меня не волнует, что идет после «логин:», я просто хочу убедиться, что именно так дается команда. Что я делаю неправильно?


person Barsan Ionut    schedule 20.10.2013    source источник
comment
strcmp для точных совпадений. Я предлагаю просмотреть библиотеку строк C, чтобы узнать, есть ли другая функция, которую вы могли бы использовать. для этой задачи...   -  person Oliver Charlesworth    schedule 20.10.2013
comment
Я копирую первые 6 символов (которые должны быть login:) в другую строку, которая будет сравниваться со строкой login:, поэтому я ищу точное совпадение.   -  person Barsan Ionut    schedule 20.10.2013
comment
О, это справедливое замечание; Я этого не заметил.   -  person Oliver Charlesworth    schedule 20.10.2013


Ответы (4)


strcmp возвращает 0, если две строки абсолютно одинаковы для выполнения того, что вы хотите сделать.

Использовать :

strstr(s2 , "login:")

(Он возвращает NULL, если строка не существует в s2)

or

strncmp(s2 , "login:" , 6)

Это сравнит первые 6 символов (если s2 начинается с «login:», он вернет 0)

person Farouq Jouti    schedule 20.10.2013

За каждой строкой в ​​C следует нулевой терминатор, который показывает

когда происходит конец строки.

Прямо сейчас вы копируете 6 букв из s1 в s2, т.е.

login:

это означает, что вы не копируете нулевой терминатор.

Таким образом, s2 не будет точно «логин:», как вы хотели.

поэтому я предлагаю скорее использовать

strstr(s2, "login:")

чтобы проверить, содержится ли login: в s2.

person Se Won Jang    schedule 20.10.2013

char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n");

Вы сравниваете свою строку с «логином», который включает следующие символы: 'l''o''g''i''n'':''\0'. Поэтому, если строки должны быть равны, должен быть '\ 0' в s2. Следующий код должен работать:

char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
s2[6]='\0'; //end of String
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n")
person Benedikt Bock    schedule 20.10.2013

библиотека строк <string.h> в c содержит две функции strcmp(s1,s2) и strcmpi(s1,s2). Функция strcmp не может сравнивать строки по длине. он сравнивает значения ascii первого символа строки, и если я предоставляю s1="Login" и s2="Sign out", он возвращает отрицательное значение, потому что ascii для «L» меньше, чем ascii для «S». если первые символы совпадают, чем для проверки 2-го.

person user2248979    schedule 22.06.2018