#c #scanf #warnings #compiler-warnings #getchar
#c #scanf #предупреждения #компилятор -предупреждения #getchar
Вопрос:
Я пишу программу на C, и это одна из моих функций:
void group3()
{
char select[5];
printf("nDetails etc.");
printf("nPlease confirm Yes/No if you would like to subscribe:");
scanf("%s", select);
if (select == "Yes")
printf("Good.");
else
{
printf("Alright.");
main();
}
}
Но когда я пытаюсь скомпилировать и отладить программу, появляется предупреждение «возвращаемое значение игнорируется: ‘scanf'». Я заметил, что предупреждение появляется, когда я запускаю scanf и для целых чисел, но программа все еще работает для целых чисел. Однако, когда я пытаюсь сканировать строки, это не работает. Я пытался использовать getchar (), но то же самое предупреждение возникает для getchar (). Я также пытался использовать scanf_s, но та же проблема возникает, когда я пытаюсь scanf_s для строк. Я также определил _CRT_SECURE_NO_WARNINGS в своей программе. Был бы очень признателен, если бы кто-нибудь мог объяснить мне, как я могу устранить это предупреждение / заставить scanf или getchar работать со строками.
редактировать: благодаря некоторым полезным пользователям я узнал, что проблема заключается не в том, что строка не была прочитана, а в том, что я не могу сравнивать строки, используя оператор if таким образом. ответ находится в разделе комментариев, и я не могу выбрать его как правильный ответ на этот вопрос, но этот вопрос закрыт. спасибо 🙂
Комментарии:
1. исходя из этого, вы действительно хотите вызвать
main()
свою функцию???2. @user3121023 спасибо за совет. 🙂 однако я все еще ищу решение относительно того, почему scanf не читает строку здесь, потому что, если scanf не читает строку, я все равно не могу использовать для нее оператор if
3. @user3121023 ооо, хорошо, я попробовал, и теперь я понимаю, что ты имеешь в виду! это была моя ошибка, извините и спасибо!! я очень ценю это, хорошего дня! : D
Ответ №1:
Проблема в том, что возвращаемое значение scanf()
игнорируется, поэтому не игнорируйте это, чтобы устранить предупреждение.
scanf()
возвращает количество прочитанных данных при успешном завершении и отрицательное число при ошибке, поэтому полезно проверить, успешно ли он прочитал требуемые данные.
Пример:
if (scanf("%4s", select) != 1) {
fputs("read errorn", stderr);
exit(1);
}
Также полезно прочитать длину для чтения, чтобы избежать переполнения буфера.
Это также сделано в приведенном выше примере.
Еще один момент заключается в том, что select == "Yes"
это неправильный способ сравнения строк в C. Это сравнение указателей, и это не будет правдой, потому что массив и строковый литерал хранятся в разных местах памяти. strcmp()
функция from string.h
полезна для сравнения строк.
Комментарии:
1. может быть, в вашем ответе также есть замечание о вызове main ?
2. Рекурсивный вызов @bruno
main()
разрешен в C. Я не могу сказать, что это неправильно из этого кода.3. по крайней мере, это подозрительно 😉
4. извините, я новичок в C, поэтому я не совсем уверен, что вы имеете в виду, но я попытался запустить приведенный выше код в своей программе, и ни сообщение об ошибке, ни отрицательное число не всплывают… как исправить ошибку scanf, которая не позволяет успешно прочитать строку?
5. @cmy в текущем случае scanf не будет успешным, если вы достигнете конца файла до его вызова, только вы можете решить, что делать в этом случае 😉