在c中使用struct时无法获得价值[关闭]

Posted

技术标签:

【中文标题】在c中使用struct时无法获得价值[关闭]【英文标题】:Cannot get value when working with struct in c [closed] 【发布时间】:2022-01-16 05:05:05 【问题描述】:

我正在编写一个程序,提示用户输入城市信息(在我用 2 个城市测试的程序中:city a, b)然后打印出这些值。每个城市有 4 个值:nameincomepopulationliterarte_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 启用此警告和其他功能。 【参考方案1】:

你错过了scanf的电话:

printf("%lf", &tmp->literate_rate);

应该是

scanf("%lf", &tmp->literate_rate);

另外,您应该检查 scanf 的结果(返回扫描令牌的数量)以确保扫描成功。

【讨论】:

非常感谢您的建议,非常感谢。

以上是关于在c中使用struct时无法获得价值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我无法获得我在 Tkinter 中的条目的价值 | Python

在Angular 7中无法获得选择的价值

在表单中提交禁用的输入无法获得价值

为什么我无法获得价值?

使用ajax无法在我的控制器中获得价值? [重复]

Swift didReceiveRemoteNotification userInfo 无法获得价值