gpt4 book ai didi

c - 调用双变量后,对存储为 union 的数据进行 Printf 不会给出任何输出

转载 作者:行者123 更新时间:2023-11-30 15:01:09 24 4
gpt4 key购买 nike

我正在开发一个程序,其输入如下:

3.14(变量存储在union中)
4(调用次数)
int(要求返回的类型)

float

输出时我应该得到:
1078523331
1078523331
3.140000
0.000000

Full instruction to this task
我的程序除了双重情况外都可以工作:程序没有给我任何输出,而是没有给我任何输出。谁能解释一下为什么?这是我的代码。

#include <stdio.h>
#include <string.h>
#define SIZE 1000
#define CHARLENGTH 6
union Data {
int i;
long long l;
float f;
double d;
};
int main(){
union Data x;
char types[SIZE][CHARLENGTH];
int n;
scanf("%f",&x.f);
scanf("%d",&n);
for(int i = 0;i<=n+1;i++){
fgets(types[i],CHARLENGTH,stdin);
types[i][strcspn(types[i],"\n")] ='\0';//removing newline
}

for(int i = 1;i<=n+1;i++){
if(strcmp(types[i], "int") == 0){
printf("%d\n",x.i);
}
else if(strcmp(types[i], "long") == 0){
printf("%lli\n",x.l);
}
else if(strcmp(types[i], "float") == 0){
printf("%f\n",x.f);
}
else if(strcmp(types[i], "double") == 0){
printf("%lf\n",x.d);
}
}

}

最佳答案

您没有在数组 types 中为六字符字符串(例如 "double")留出足够的空间,因为您需要一个额外的字节作为终止符。然而,因为您以合理的方式使用了 fgets() ,所以您避免了超出该数组的范围 - fgets() 在第五个之后就停止读取字符“double”,并附加终止符。因此,实际存储的是“doubl”。当然,这与 "double" 不同,因此不会产生相应的输出。

  • 首先,您应该将 CHARLENGTH 增加到至少 7。这样做可以解决您眼前的问题。

  • 您还应该考虑在循环中添加最后一个 else 子句,以便在不满足其他情况的情况下打印出诊断消息。这样的消息可能会让您了解正在发生的事情。

  • 为了稳健性,您可以考虑确保读取并丢弃 type 行上的所有尾随垃圾;事实上,即使是较短类型名称之一后面的尾随空格也会搞砸您的匹配。

  • 也许它是对练习的响应,但如果它提示每个输入项,您的程序将会更加用户友好。

关于c - 调用双变量后,对存储为 union 的数据进行 Printf 不会给出任何输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com