Как исправить "возвращаемое значение игнорируется: 'scanf'" код C6031 в Visual Studio - PullRequest
3 голосов
/ 19 сентября 2019

Я новичок в кодировании C (и кодировании в целом), поэтому я практиковался с некоторыми случайными программами.Предполагается, что эта цена определяет стоимость транзитного билета (цены Translink в Ванкувере) в зависимости от возраста пользователя и желаемого количества «зон» (насколько далеко они хотели бы зайти).Я успешно скомпилировал его, но по какой-то причине, которую я не могу понять, функции scanf игнорируются.Как я могу это исправить?Пожалуйста, имейте в виду, что я кодировал только несколько дней.Спасибо!

int main(void) {

int zones;
int age;
double price = 0.00;

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

if (zones < 1) {
    printf("Invalid entry\n");
    price = 0.00;
}

else if (zones > 3) {
    printf("Invalid entry\n");
    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 + tax\n", price);

system("PAUSE");
return 0;
}

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Из документации scanf() (например, https://en.cppreference.com/w/c/io/fscanf)

Возвращаемое значение
1-3) Количество успешно полученных аргументов (может быть равно нулю в случае, если сбой сопоставления произошел ранее).первый получающий аргумент был назначен), или EOF, если ошибка ввода произошла до того, как был назначен первый получающий аргумент.

Вы игнорируете это возвращаемое значение.

Замените

scanf("%d", &age);

на

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 */
}

..., чтобы выяснить, выполняется ли сканированиеудалось.Не делать это - плохая идея и стоит того предупреждения, которое вы получили.

Если вы хотите обрабатывать сбои более изящно, например, снова запрашивать у пользователя,
использовать цикл и читать http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.htmlо подводных камнях, с которыми вы можете столкнуться.
Я не говорю, что вы не должны использовать scanf, в статье много объясняется об использовании scanf, в то время как вы пытаетесь убедить вас не делать этого.

1 голос
/ 19 сентября 2019

Слишком много здесь, чтобы добавить комментарий.

Я использую версию Visual C, но она никогда не жалуется на то, что возвращаемое значение из scanf не используется. делает , чтобы жаловаться, что scanf является небезопасным и устарело , когда это не так.

MS думает, что я должен бытьиспользование собственной «более безопасной» версии scanf_s, которая даже сложнее в использовании, и IMO вовсе не безопаснее - потому что она не похожа на замену, но принимает другие аргументы, и поэтому легко допустить ошибки при ее использовании.

Одной из последующих проблем является то, что компилятор выдает предупреждение для при каждом использовании scanf (и некоторых других функций), что скрывает другие предупреждения.Я имею дело с этим, как рекомендовано, добавив #define перед первым включением заголовка библиотеки.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

Есть и другие вопросы, о которых MS тоже предупреждает, и я на самом деле ставлю три #defines в началекаждый файл:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE  
#define _CRT_NONSTDC_NO_DEPRECATE

#include <stdio.h>

А теперь соответствующие предупреждения легко увидеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...