对于存储为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语句的时间,未初始化或初始化(通过任一方法)的比较: ![在这里输入图片描述

    链接地址: http://www.djcxy.com/p/90307.html

    上一篇: Printf on data stored as union gives no output after called for double variable

    下一篇: point underflow in program output