возвращаемое значение игнорируется: ‘scanf’ (закрыто)

#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 не будет успешным, если вы достигнете конца файла до его вызова, только вы можете решить, что делать в этом случае 😉