2015-06-12 3 views
1

У меня есть функция, которая считывает данные и сохраняет их внутри структуры, объявленной в заголовке, функция читает строку в порядке, но попытка прочитать число (int) возвращает случайное числовое значение.Печать переменной типа int из struct дает неправильное значение

Это код, который вызывает проблемы. Структура внутри 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 не делает.

+1

'Не можете называть int' --- a Вы уверены, что хотите написать это? –

+0

Малый: Рекомендовать 'fscanf (file1,"% 49s ", действия [i] .name);' (wdith и no &) – chux

ответ

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. Всегда проверяйте на возвращаемое значение scanf() и семью для обеспечения ожидаемого результата сканирование является успешным.
  3. Не использовать только переменная петля для массива фиксированного размера. Всегда проверяйте индекс MAX также.
  4. Всегда старайтесь ограничивать длину ввода, иначе это может привести к переполнению буфера. Используйте что-то вроде

    fscanf(file1,"%49s",activities[i].name); //input limited to 49 chars 
    
  5. Чтобы напечатать адрес, вам нужно %p спецификатор формата.
+0

food [i] .calories = 1; был случайным фрагментом кода, который я забыл удалить, когда я разместил его, его проблема не проблема, fopen() работает, функция просматривает строки, присутствующие внутри файла, и сохраняет их внутри структуры без проблем, –

+0

@EduardC Да, обновил мой ответ , :-) –

+0

@chux Я добавил ваше предложение самому моему asnwer.:-) –

4

Этот

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

печатает адрес памяти food[i].calories. Если вы хотите получить значение, вы должны сделать просто

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

и как мне на самом деле распечатать значение калорий? –

+1

Ницца. Думаю, ты передумал мне. Я должен (и я) добавить атрибут к моему ответу. :-) –

Смежные вопросы