对于存储为union的数据,printf在调用double变量后不会输出
我正在编写程序,其输入如下所示:
3.14(它是可变的存储在工会中)
4(通话次数)
int(要求返回的类型)
长
浮动
双
在输出上我应该得到:
1078523331
1078523331
3.140000
0.000000
对此任务的完整说明
我的程序工作除了双案例:而不是给我任何输出程序给我没有。 任何人都能解释我为什么? 这是我的代码。
#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")] =' ';//removing newline
}
for(int i = 1;i<=n+1;i++){
if(strcmp(types[i], "int") == 0){
printf("%dn",x.i);
}
else if(strcmp(types[i], "long") == 0){
printf("%llin",x.l);
}
else if(strcmp(types[i], "float") == 0){
printf("%fn",x.f);
}
else if(strcmp(types[i], "double") == 0){
printf("%lfn",x.d);
}
}
}
对于像"double"
这样的六个字符的字符串,在数组types
不允许有足够的空间,因为您需要额外的字节作为终止符。 但是,因为您已经以合理的方式使用了fgets()
,所以您已经保存了超出数组边界的限制 - fgets()
只是在“double”的第五个字符后停止读取,并附加了一个终止符。 因此,实际存储的是"doubl"
。 当然,这与"double"
不同,因此不会产生相应的输出。
首先,你应该增加CHARLENGTH
至少7.这样做会照顾你的眼前的问题。
您还应该考虑在循环中添加一个else
子句,以便在其他任何情况都不满足的情况下打印诊断消息。 这样的消息可能会让你知道发生了什么。
为了提高鲁棒性,您可以考虑确保读取并丢弃type
行中的任何尾随垃圾; 就像这样,即使是其中一个较短的类型名称后面的空白也会导致您的匹配。
也许它是这个练习的答案,但是如果它提示输入每个项目,那么你的程序会更加方便用户使用。
三四个简短的观察:
0)至少, main
函数应该是:int main(void)。
1)因为C字符串被定义为以NULL结尾的char
数组,所以字符串“double”需要一个7 char
空间的缓冲区来容纳它。
|d|o|u|b|l|e| | //includes NULL char termination
更改
#define CHARLENGTH 6
至
#define CHARLENGTH 7
2)因为从运行程序的cmd行提示中不清楚要输入哪些项目,如果没有输入其中一个字符串types
(例如“double”),则该行:
fgets(types[i],CHARLENGTH,stdin);
不会按照它的意图去做。 建议添加一些printf
语句,并附带说明每行所有3个条目的输入内容。
3)使用前未初始化types
。
这可以通过简单地初始化来解决:
memset(types, 0, SIZE*CHARLENGTH);
甚至更简单:
char types[SIZE][CHARLENGTH] = {0};
内存看起来像到达fgets
语句的时间,未初始化或初始化(通过任一方法)的比较:
上一篇: Printf on data stored as union gives no output after called for double variable