Меню

Возвращаемое значение пропущено scanf ошибка

I am brand new to coding C (and coding in general) so I have been practicing with some random programs. This one is supposed to determine the cost of a transit ticket (Translink Vancouver prices) based on the user’s age and the desired number of «zones» (how far they would like to go). I have compiled it successfully but for some reason which I can not figure out, the scanf functions are being ignored. How do I fix this? Please keep in mind I have only been coding for a few days. Thanks!

int main(void) {

int zones;
int age;
double price = 0.00;

printf("Welcome to TransLink cost calculator!nn");
printf("Please enter the desired number of zones (1, 2, or 3) you wish to travel: ");
scanf("%d", &zones);

if (zones < 1) {
    printf("Invalid entryn");
    price = 0.00;
}

else if (zones > 3) {
    printf("Invalid entryn");
    price = 0.00;
}

else if (zones == 1) {

    printf("Please enter your age: ");
    scanf("%d", &age);

    if (age < 0.00) {
        printf("Invalid Aage");
    }
    else if (age < 5) {
        price = 1.95;
    }
    else if (age >= 5) {
        price = 3.00;
    }
}

else if (zones == 2) {

    printf("Please enter your age: ");
    scanf("%d", &age);

    if (age < 0) {
        printf("Invalid Aage");
    }
    else if (age < 5) {
        price = 2.95;
    }
    else if (age >= 5) {
        price = 4.25;
    }
}

else if (zones == 3) {

    printf("Please enter your age: ");
    scanf("%d", &age);

    if (age < 0) {
        printf("Invalid Aage");
    }
    else if (age < 5) {
        price = 3.95;
    }
    else if (age >= 5) {
        price = 4.75;
    }
}

printf("The price of your ticket is: $%.2f + taxn", price);

system("PAUSE");
return 0;
}

asked Sep 19, 2019 at 5:25

Caiden Keller's user avatar

5

A bit too much here to put in a comment.

I use a version of Visual C but it never complains about the return value from scanf not being used. What it does is to complain that scanf is unsafe and deprecated, when it isn’t.

MS thinks I should be using its own «safer» version scanf_s which is even tricker to use and IMO no safer at all – because it is not a like-for-like replacement but takes different arguments, and so it is easy to make mistakes in using it.

One consequent problem is the compiler issues a warning for every use of scanf (and some other functions) which obscures other warnings. I deal with it as advised by adding a #define before the first library header inclusion.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

There are other matters which MS warns about too, and I actually place three #defines at the start of each file:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE  
#define _CRT_NONSTDC_NO_DEPRECATE

#include <stdio.h>

And now the relevant warnings are easy to see.

answered Sep 19, 2019 at 7:42

Weather Vane's user avatar

Weather VaneWeather Vane

33.2k7 gold badges36 silver badges56 bronze badges

2

From documentation of scanf() (e.g. https://en.cppreference.com/w/c/io/fscanf)

Return value
1-3) Number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.

You are ignoring that return value.

Replace

scanf("%d", &age);

by

int NofScannedArguments=0; /* Number of arguments which were
successfully filled by the most recent call to scanf() */

/* ...  do above once, at the start of your function */

NofScannedArguments= scanf("%d", &age);

/* check the return value to find out whether scanning was successful */
if(NofScannedArguments!=1) /* should be one number */
{
    exit(EXIT_FAILURE); /* failure, assumptions of program are not met */
}

… to find out whether scanning succeeded.
Not doing so is a bad idea and worth the warning you got.

In case you want to handle failures more gracefully, e.g. prompt the user again,
use a loop and read http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html about the pitfalls you may encounter.
I am not saying you should NOT use scanf, the article explains a lot about using scanf, while trying to convince you not to.

answered Sep 19, 2019 at 6:05

Yunnosch's user avatar

YunnoschYunnosch

25.8k9 gold badges42 silver badges54 bronze badges

4

Using C++ functions for input is SO much easier. Instead of scanf and printf one could use cin and cout as the following demonstrates:

#include <iostream>  // for cin and cout use

int main()
{
    int zones;

    std::cout << "Enter zones" << std::endl;  // endl is similar to n
    std::cin >> zones;
    std::cout << "Your zones is " << zones << std::endl;
}

answered Jun 9, 2021 at 14:40

Ken's user avatar

2

VdiSn

0 / 0 / 0

Регистрация: 11.09.2022

Сообщений: 1

1

11.09.2022, 12:14. Показов 3731. Ответов 2

Метки нет (Все метки)


При scanf выдает ошибку, при csanf_s ошибки нет, можете разъяснить что не так в записи(Предупреждение C6031 Возвращаемое значение пропущено: «scanf»)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <math.h>
 
int main() {
    setlocale(LC_ALL, "Russian");
    int x1, y1, x2, y2, stor_x = 0, stor_y = 0, P = 0, S = 0;
    printf("Введите значение х точки А = ");
    scanf("%d", &x1);
    printf("Введите значение y точки А = ");
    scanf("%d", &y1);
    printf("Введите значение х точки B = ");
    scanf("%d", &x2);
    printf("Введите значение y точки B = ");
    scanf("%d", &y2);
    stor_x = abs(x1 - x2);
    stor_y = abs(y1 - y2);
    P = (2 * stor_x) + (2 * stor_y);
    S = stor_x * stor_y;
    printf("P = %d nS = %d", P, S);
    return 0;
 
 
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

11.09.2022, 12:14

Ответы с готовыми решениями:

Структура в List<>, «Не удалось изменить возвращаемое значение»
Всем привет.
namespace
{
struct STRUCT
{
internal float a;

Не удалось изменить возвращаемое значение «Transform.position», т.к. оно не является переменной
Не удалось изменить возвращаемое значение &quot;Transform.position&quot;, т.к. оно не является переменной….

Известны сорта роз, выращиваемых тремя цветоводами: «Анжелика», «Виктория», «Гагарин», «Ave Maria», «Катарина», «Юбилейн
Известны сорта роз, выращиваемых тремя цветоводами: &quot;Анжелика&quot;, &quot;Виктория&quot;, &quot;Гагарин&quot;, &quot;Ave…

Дан массив строк: «red», «green», «black», «white», «blue». Запишите в файл элементы массива построчно (в новой строке)
пишу так но не помогает:

static void Main(string args)
{
string…

2

Эксперт .NET

16739 / 12492 / 3283

Регистрация: 17.09.2011

Сообщений: 20,719

11.09.2022, 12:38

2

Цитата
Сообщение от VdiSn
Посмотреть сообщение

Ошибка C6031

Цитата
Сообщение от VdiSn
Посмотреть сообщение

Предупреждение C6031

Так ошибка или предупреждение?

scanf возвращает значение, которое вы игнорируете — об этом компилятор и предупреждает.



0



zss

Модератор

Эксперт С++

12624 / 10123 / 6096

Регистрация: 18.12.2011

Сообщений: 27,157

11.09.2022, 17:45

3

У меня Ваш код никаких предупреждений не выдает.

Не в тему, но

Цитата
Сообщение от VdiSn
Посмотреть сообщение

#include <iostream>

каким боком здесь?
Только потому, что забыли добавить

C
1
#include <locale.h>

??????????????????
Сомнительное решение
1. Зачем сишную программу превращать в C++
2. В принципе, не обязан iostream подключать locale.h. Просто повезло….



0



As @SteveSummit indicates in a comment, most C implementations have a mechanism to identify functions whose return value should not be ignored.

C itself (as defined by the C standard) has always allowed a caller to ignore the return value of a function. It even allows a function declared with a return value type to not return any value as long as all callers ignore the return value.

However, that permissiveness does not generally lead to good programming practice. In some cases, it is very likely that ignoring the return value of a function will lead to a bug. scanf is considered to be such a function, so the authors of standard libraries tend to mark scanf as requiring that the return value be used.

There is no standard way to mark a function as requiring use of their return values. In GCC and Clang, this is done using the attribute warn_unused_result:

int fn (int a) __attribute__ ((warn_unused_result));

(See the GCC documentation for the warn_unused_result function attribute and how to turn off the warning (not recommended): the `-Wno-unused-result.)

In MSVC, it’s done with the _Check_return_ macro, found in sal.h:

#include <sal.h>
_Check_return_ int fn (int a);

(See the Visual Studio docs for error C6031 and this documenation on the Source Annotation Library (sal).)

There are good reasons not to ignore the return value of any library function which uses the return value to indicate failure, including many standard library functions which do input or output. Ignoring input or output failure can lead to problems, but the problems are more evident when ignoring input failure because that can lead to the use of uninitialised values, which in turn can lead to Undefined Behaviour. That is certainly the case for scanf: ignoring its return value means that your program will not respond correctly to malformed input, which is almost certainly a bug.

Ignoring the failure of output functions will sometimes mean that the user is not warned about failure to save persistent data. That can be serious, and it may well be that some action needs to be taken to save that data. But in other cases, the error simply means that the user didn’t see some logging message and most likely will not see future logging messages either. This might not be considered important.

As @SteveSummit indicates in a comment, most C implementations have a mechanism to identify functions whose return value should not be ignored.

C itself (as defined by the C standard) has always allowed a caller to ignore the return value of a function. It even allows a function declared with a return value type to not return any value as long as all callers ignore the return value.

However, that permissiveness does not generally lead to good programming practice. In some cases, it is very likely that ignoring the return value of a function will lead to a bug. scanf is considered to be such a function, so the authors of standard libraries tend to mark scanf as requiring that the return value be used.

There is no standard way to mark a function as requiring use of their return values. In GCC and Clang, this is done using the attribute warn_unused_result:

int fn (int a) __attribute__ ((warn_unused_result));

(See the GCC documentation for the warn_unused_result function attribute and how to turn off the warning (not recommended): the `-Wno-unused-result.)

In MSVC, it’s done with the _Check_return_ macro, found in sal.h:

#include <sal.h>
_Check_return_ int fn (int a);

(See the Visual Studio docs for error C6031 and this documenation on the Source Annotation Library (sal).)

There are good reasons not to ignore the return value of any library function which uses the return value to indicate failure, including many standard library functions which do input or output. Ignoring input or output failure can lead to problems, but the problems are more evident when ignoring input failure because that can lead to the use of uninitialised values, which in turn can lead to Undefined Behaviour. That is certainly the case for scanf: ignoring its return value means that your program will not respond correctly to malformed input, which is almost certainly a bug.

Ignoring the failure of output functions will sometimes mean that the user is not warned about failure to save persistent data. That can be serious, and it may well be that some action needs to be taken to save that data. But in other cases, the error simply means that the user didn’t see some logging message and most likely will not see future logging messages either. This might not be considered important.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Водонагреватель термекс 80 литров коды ошибок
  • Возвращаемое значение пропущено fscanf ошибка