打印结构的int成员变量会给出错误的值

时间:2015-06-12 13:21:59

标签: c struct

我有一个函数读取数据并将其存储在头文件中声明的结构中,该函数读取一个字符串,但尝试读取一个数字(int)会返回一个随机数值。

这是导致问题的代码。 functions.h内的结构。

 struct stats{
  char name[50];
  int calories;
 }temp_list[50],activities[50],food[50];

和实际功能

#include <stdio.h>
#include "functions.h"

void scandata(FILE *file1,FILE *file2,int size,int size2){
    int i;
    file1=fopen("in_activities.txt", "r");
    file2=fopen("in_food.txt","r");

    for(i=0;i<size;i++){
        fscanf(file1,"%s",&activities[i].name);
        fscanf(file1,"%d",&activities[i].calories);
    }
    for(i=0;i<size2;i++){
        fscanf(file2,"%s" "%d",&food[i].name,&food[i].calories);

    }
    for(i=0;i<size2;i++){              //test print to see the values
        printf("%s ",&food[i].name);
        printf("-%d",&food[i].calories);
    }

    fclose(file1);
    fclose(file2);
    return;
}

如果我打印字符串,它会正确显示,但int值不会。

2 个答案:

答案 0 :(得分:4)

printf("-%d", &food[i].calories)

打印food[i].calories的内存地址。如果你想要这个值,你应该只做

printf("-%d", food[i].calories)

答案 1 :(得分:3)

在您的代码中,i自动本地变量,接下来,

 food[i].calories=1;

i未经初始化使用。它调用undefined behaviour

除此之外,正如ericbn's answer中正确提到的,您的printf()陈述是错误的。变化

 printf("-%d",&food[i].calories);   //(TRIES TO) print the address of the variable
                                    //refer Note 5 below for details

printf("-%d",food[i].calories);    //prints the value of the variable

那就是说,

  1. 始终检查fopen()
  2. 是否成功
  3. 始终检查scanf()和系列的返回值,以确保预期扫描成功。
  4. 永远不要仅将变量循环用于固定大小的数组。始终检查MAX指数
  5. 总是尝试对输入进行长度限制,否则很可能导致缓冲区溢出。使用像

    这样的东西
    fscanf(file1,"%49s",activities[i].name);  //input limited to 49 chars
    
  6. 要打印地址,您需要%p格式说明符。