【发布时间】:2022-01-16 05:05:05
【问题描述】:
我正在编写一个程序,提示用户输入城市信息(在我用 2 个城市测试的程序中:city a, b)然后打印出这些值。每个城市有 4 个值:name、income、population 和 literarte_rate。问题是当我输入信息literrate_rate 时,它会自动打印出0.000000 并将其保存到变量中。我仍然可以为其输入值和下一个信息。
输入
city name: qwerty 123 !@#
income: 789
population: 123456
literation: 0.000000685
city name: asdfgh 456 $%^
income: 456
population: 999999
literation: 0.00000065684
输出
city name: qwerty 123 !@#
income: 789
population: 123456
literation: 0.00
city name: asdfgh 456 $%^
income: 456
population: 999999
literation: 0.00
这是我的代码
#include <stdio.h>
#include <string.h>
typedef struct City
{
char name[51];
double income;
unsigned int population;
double literate_rate;
}city;
void input(city *tmp);
void output(city tmp);
int main(){
city a, b;
input(&a);
input(&b);
output(a);
output(b);
return 0;
}
void input(city *tmp){
printf("city name: ");
fgets(tmp->name, 50, stdin);
tmp->name[strlen(tmp->name)-1]='\0';
printf("income: ");
scanf("%lf", &tmp->income);
while(getchar()!='\n');
printf("population: ");
scanf("%d", &tmp->population);
while(getchar()!='\n');
printf("literation: ");
printf("%lf", &tmp->literate_rate);
while(getchar()!='\n');
}
void output(city tmp){
printf("\ncity name: %s", tmp.name);
printf("\nincome: %.2f", tmp.income);
printf("\npopulation: %d", tmp.population);
printf("\nliteration: %.2f", tmp.literate_rate);
}
我尝试在每个带有数字的scanf 之后使用while(getchar()!='\n');,但这并不能解决问题。
那么如何解决它并提高效率?
提前致谢。
【问题讨论】:
-
在输入函数中,你不是在扫描literate_rate的值,而是在打印它的地址。
-
您使用
printf阅读literation。你的编译器不会给你关于这一行的警告吗,因为我认为在所有现代 C 编译器中,当格式字符串作为文字字符串存在时检查 printf 参数的类型是标准的。 -
在编译过程中类似:
gcc -Wall filename.c -o outputfilename -
我不知道您使用的完整命令是什么,但要查看警告请使用
-Wall选项。 -
看起来 ubuntu 默认启用格式检查,但在标准 gcc 中未启用。
gcc -Wformat启用此功能,但正如其他人所建议的那样,建议使用gcc -Wall启用此警告和其他功能。