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
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 VaneWeather Vane
33.7k7 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
YunnoschYunnosch
26k9 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
2
title | description | ms.date | f1_keywords | helpviewer_keywords | ms.assetid | |||
---|---|---|---|---|---|---|---|---|
Warning C6031 |
Describes C++ Code Analysis warning C6031 and how to resolve it. |
10/04/2022 |
|
C6031 |
59e1ef0a-b3ca-4ffa-bcb3-ad2bd22ece22 |
Warning C6031
Return value ignored: ‘called-function‘ could return unexpected value
Remarks
Warning C6031 indicates the caller doesn’t check a function’s return value for failure. Depending on which function is being called, this defect can lead to seemingly random program misbehavior. That includes crashes and data corruptions in error conditions or low-resource situations.
In general, it isn’t safe to assume that calls to functions requiring disk, network, memory, or other resources will succeed. The caller should always check the return value and handle error cases appropriately. Also consider using the _Must_inspect_result_
annotation, which checks that the value is examined in a useful way.
Code analysis name: RETVAL_IGNORED_FUNC_COULD_FAIL
Example
The following code generates warning C6031:
#include <stdio.h> void f( ) { fopen( "test.c", "r" ); // C4996, C6031 return value ignored // code ... }
To correct this warning, check the return value of the function as shown in the following code:
#include <stdio.h> void f( ) { FILE *stream; if ( (stream = fopen( "test.c", "r" )) == NULL ) return; // code ... }
The following code uses safe function fopen_s
to correct this warning:
#include <stdio.h> void f( ) { FILE *stream; errno_t err; if ( (err = fopen_s( &stream, "test.c", "r" )) !=0 ) { // code ... } }
This warning is also generated if the caller ignores the return value of a function annotated with the _Check_return_
property as shown in the following code.
#include <sal.h> _Check_return_ bool func(); void test_f() { func(); // Warning C6031 }
To correct the previous warning, check the return value as shown in the following code:
#include <sal.h> _Check_return_ bool func(); void test_f() { if ( func() ) { // code ... } }
In cases where it’s necessary to ignore the return value of a function, assign the returned value to std::ignore
. Assigning to std::ignore
clearly indicates developer intent and helps in future code maintenance.
#include <tuple> #include <ctime> #include <stdio.h> void f() { std::srand(static_cast(std::time(nullptr))); // set initial seed value to system clock std::ignore = std::rand(); // Discard the first result as the few random results are always small. // ... }
See also
fopen_s
, _wfopen_s
Using SAL Annotations to reduce code defects
При объявлении scanf, строки кода подчёркиваются желтой волнистой линией. Как ни старался решить эту проблему, ничего не выходит.
#include <stdio.h>
int main(){
float x, y, res;
scanf("%f", &x);
scanf("%f", &y);
res = x / y;
printf("Result: %.2fn", res);
return 0;
}
Harry
215k15 золотых знаков117 серебряных знаков228 бронзовых знаков
задан 22 июн 2022 в 15:02
3
Попробуйте переписать так:
#include <stdio.h>
int main(){
float x, y, res;
if (scanf("%f", &x) != 1) return 1;
if (scanf("%f", &y) != 1) return 1;
res = x / y;
printf("Result: %.2fn", res);
return 0;
}
ответ дан 22 июн 2022 в 18:47
HarryHarry
215k15 золотых знаков117 серебряных знаков228 бронзовых знаков
Kartoshkas 0 / 0 / 0 Регистрация: 04.10.2021 Сообщений: 1 |
||||
1 |
||||
04.10.2021, 18:40. Показов 3276. Ответов 3 Метки micrisift visual studio 2019, си для начинающих (Все метки)
Я буквально сегодня, по какому-то видео уроку начала изучать С, вот то, что создано мной на данном этапе
Пишу я в Microsoft Visual studio, при запуске этого кода не даёт ввести чисел. После закрытия консоли в предупреждениях C6031, return value ignored: ‘scanf’. Подскажите, пожалуйста, в чём может быть проблема?
0 |
Модератор 4696 / 2709 / 1445 Регистрация: 14.12.2018 Сообщений: 4,997 Записей в блоге: 1 |
|
04.10.2021, 19:11 |
2 |
Kartoshkas, заменяйте функцию
0 |
Вездепух 10987 / 5970 / 1630 Регистрация: 18.10.2014 Сообщений: 14,970 |
|
04.10.2021, 19:34 |
3 |
при запуске этого кода не даёт ввести чисел. Вы что-то выдумываете.
после закрытия консоли в предупреждениях C6031, return value ignored: ‘scanf’. Что такое «предупреждения после закрытия консоли»???
Подскажите, пожалуйста, в чём может быть проблема? Сформулируйте осмысленное описание проблемы. Пока что ничего не понятно.
0 |
easybudda Модератор 11908 / 7281 / 1722 Регистрация: 25.07.2009 Сообщений: 13,328 |
||||
04.10.2021, 20:11 |
4 |
|||
Сообщение было отмечено Kartoshkas как решение Решение
заменяйте функцию scanf() на scanf_s() …и получите обратную историю: M$VS пропустит (не факт — ругань на игнорирование результата, возвращённого scanf), а онлайн компилятор скорее всего скажет «опаньки».
Подскажите, пожалуйста, в чём может быть проблема? Проблема в заморочках компилятора от Майкрософт, про которые пишут далеко не во всех книгах по языку С, поскольку к языку это никак не относится.
Не поможет — пишите, там ещё есть танцы с бубнами…
2 |
When running the scanf function in Visual Studio 2019, the following problems are encountered:
Solution:
method 1:
Add code at the top of the file:#pragma warning(disable:4996)
Method 2:
Right clickIn projectSource code(main.c), openAttributesColumn>Configuration properties>C/C++>All options,willSDL checkTono,save
Method 3:
willscanfToscanf_s
The above three methods are all Baidu, the first two of which are effective in the pro-test, and the third method is still wrong.
The test source program comes fromNovice Tutorial.
//#pragma warning(disable:4996)
#include <assert.h>
#include <stdio.h>
int main()
{
int a;
char str[50];
printf("Please enter an integer value:");
scanf("%d",&a);
assert(a >= 10);
printf("The integer entered is: %dn", a);
printf("Please enter a string: ");
scanf("%s", str);
assert(str != NULL);
printf("The input string is: %sn",&str);
return(0);
}
Learning link:
The usage of assert
C language scanf function usage complete guideNot seen