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