如何在Visual Studio中修复“忽略返回值:'scanf'”代码C6031

时间:2019-09-19 05:25:30

标签: c

我对编码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;
}

3 个答案:

答案 0 :(得分:2)

摘自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 :(得分:1)

这里太多了,无法发表评论。

我使用的是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>

现在,相关警告很容易看到。

答案 2 :(得分:0)

使用 C++ 函数进行输入要容易得多。可以使用 cin 和 cout 代替 scanf 和 printf ,如下所示:

#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;
}