我有一个函数读取数据并将其存储在头文件中声明的结构中,该函数读取一个字符串,但尝试读取一个数字(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
值不会。
答案 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
那就是说,
fopen()
。scanf()
和系列的返回值,以确保预期扫描成功。总是尝试对输入进行长度限制,否则很可能导致缓冲区溢出。使用像
这样的东西fscanf(file1,"%49s",activities[i].name); //input limited to 49 chars
%p
格式说明符。