Функция Strcmp() не возвращает 0

я пытался сравнить две строки, используя strcmp(), и в случае, если они равны, функция возвращает -1 (что означает, что они не равны), я не знаю, что не так.

int main()
{
char password[]={'6','6','6','6','6','6'};
char passmatch[6];
int i =0;
for(i ; i<6 ; i++)
{
    passmatch[i]='6';
}

printf("\n");
if(strcmp(password,passmatch)==0)
{
    printf("Strings are equal");
}
else
{
    printf("String are'nt equal");
}


return 0;

}


person Ahmed Mohamed Ashraf    schedule 06.09.2015    source источник


Ответы (2)


В C строки должны заканчиваться нулем, чтобы их можно было использовать со стандартной библиотекой. Попробуйте поставить «\ 0» в конце или сделать строковый литерал «обычным» способом, например. char password[] = "666666";, то язык автоматически поставит \0 в конце.

person Chris Beck    schedule 06.09.2015
comment
Хорошо, но что делать, если пользователь сам вводит строку для сравнения с сохраненной строкой, определенной в main()? - person Ahmed Mohamed Ashraf; 06.09.2015
comment
Это зависит от того, как именно вы получаете ввод, но в основном вам нужно гарантировать, что результирующая строка завершается нулем. Большинство стандартных методов сделают это за вас. - person Chris Beck; 06.09.2015
comment
моя программа требует ввода пароля пользователем, и если пароль, введенный пользователем, совпадает с сохраненным паролем, приложение будет запущено, и пользователь должен ввести номер пароля по номеру с помощью клавиатуры, поэтому я сохраняю каждый номер в массиве строк и после вводя 6 цифр, я проверяю, введен ли пароль = пароль по умолчанию. - person Ahmed Mohamed Ashraf; 06.09.2015
comment
да, поэтому важно, какой именно код C вы используете для получения пользовательского ввода, который определит, завершен ли он нулем или нет - person Chris Beck; 06.09.2015
comment
Я не думаю, что вы должны ожидать, что пользователь введет нулевой терминатор. - person Carcigenicate; 06.09.2015

Проблема в том, что в C '6' (с кавычками) это не то же самое, что 6 (без кавычек). Вот почему эта петля

for(i ; i<6 ; i++) {
    passmatch[i]=6; // <<== Should be '6', not 6
}

не назначает то, что вы хотите назначить. Если вы поместите в кавычки и это 6, вы получите правильный контент, но ваша программа останется сломанной, потому что strcmp требует нулевого завершения.

Исправить можно двумя способами:

  • Добавьте нулевое завершение к обеим строкам C либо вручную, либо путем инициализации строковым литералом,
  • Переключитесь на использование memcmp, которое принимает длину и, следовательно, не требует нулевого завершения.
person Sergey Kalinichenko    schedule 06.09.2015