【问题标题】:How to fix "return value ignored: 'scanf'" code C6031 in visual studio如何在 Visual Studio 中修复“忽略返回值:'scanf'”代码 C6031
【发布时间】:2019-09-19 05:25:30
【问题描述】:

我是 C 编码(以及一般编码)的新手,所以我一直在练习一些随机程序。这个应该根据用户的年龄和所需的“区域”数量(他们想去多远)来确定交通票的成本(Translink Vancouver 价格)。我已经成功编译它,但由于某种我无法弄清楚的原因,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;
}

【问题讨论】:

  • 请解释您如何使用此调用 scanf("%d", &amp;age); 返回的值。不是扫描到age 中的值,而是该调用返回的值。告诉您扫描是否成功的值。如果你不能,那么你就有了问题的答案。
  • 感谢您的回复,但我不明白您想说什么。我不确定为什么它不起作用(因此我在这里发帖)所以如果你知道我可以如何解决它并告诉我那会很棒,谢谢。
  • 顺便说一句。这不是问题,但年龄是一个 int 并且您正在与一个浮点常量进行比较: if (age
  • scanf() 返回处理的值的数量。您应该将此与您尝试读取的变量数量进行比较,以确保它成功。例如if (scanf("%d", &amp;age) != 1) { // print error message }
  • 无论你做了什么让 Visual Studio 抱怨忽略了 scanf()s 返回值。请教给尽可能多的人。

标签: c


【解决方案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>

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

【讨论】:

  • 我完全同意禁用 MSVC 使用其伪附件 K 功能的建议;然而,scanf 系列不安全的,原因有几个,最重要的是%sgets 一样危险,并且数字转换在 numeric 上具有未定义的行为i> 输入溢出(是的,这意味着允许 C 库崩溃只是因为有人输入了太多数字)。
  • @zwol 是的,但是 C 无论如何都是不安全的。通过超出数组边界,您可以非常轻松地创建段错误。我的观点是 MS 的 scanf_s 并不比 scanf 好 - 如果使用不当,两者都会造成损坏。
【解决方案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 的内容,同时试图说服你不要这样做。

【讨论】:

  • 如果你使用的变量名比你选择的文章更合理……我经常使用rv(返回值)——我接受这太小了,但retval是一种可能性,有如果需要,可以在中间添加下划线。
  • @JonathanLeffler 我想我知道你的意思。但在这种情况下,OP 需要他们能得到的所有超明确的解释。让我看看我是否能同时满足这两种需求。那里。成交?
  • IMO this(创建一个变量)并不是真的有用,因为它真的什么也没做。至少在竞争性编程中
  • @JMuzhen 我想我明白你的意思了。但在这种情况下,OP 需要他们能得到的所有超明确的解释。
【解决方案3】:

使用 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;
}

【讨论】:

  • 首先,作者显然想知道如何使用scanfprintf;其次,您显然对scanfprintf 函数没有经验,因为虽然它们可能更难使用,但它们的运行速度比std::cinstd:cout 快得多。
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 2018-04-02
  • 2021-01-31
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2021-01-23
  • 2023-04-08
相关资源
最近更新 更多