2016-06-20 2 views
0

Я пытался напечатать значение переменной в ИНТ образом структуры, но она выводит адрес вместо .. не знаю, почему, вот код:в структуры, зсапЕ возвращает вар адрес не дорожит

 

    struct data{ 
     char name[20]; 
     int age[100]; 
    }; 

    typedef struct data dataobj; 

    int main() { 
     dataobj element; 
     printf("enter a name:\n"); 
     gets(element.name); 
     printf("name is: %s\n",element.name); 
     printf("enter a number:\n"); 
     scanf("%d",&element.age); 
     printf("number is: %d",element.age); 
     return 0; 
    } 

выход здесь:

 

    enter a name: 
    John 
    name is: John 
    enter a number: 
    30 
    number is: 6356352 
    Process returned 0 (0x0) execution time : 7.278 s 
    Press any key to continue. 

Вы можете видеть, что это не печатает 30, как я хотел, вместо этого он печатает 6356352 (который должен быть адрес element.age вар)

+0

Одно имя из 20 символов в возрасте 100 лет? – alk

+0

Да, это был тест, забыл изменить размер – Saveh

+0

В какой элемент массива вы хотите прочитать значение? – alk

ответ

1

не используйте gets, осуждается в C99 и удаляется из С11

Вместо этого используйте fgets:

char *ptr; 

fgets(element.name, sizeof element.name, stdin); 
/* Remove the trailing newline */ 
ptr = strchr(element.name, '\n'); 
if (ptr != NULL) { 
    *ptr = '\0'; 
} 

И age не является int а массив int с:

struct data{ 
    char name[20]; 
    int age[100]; 
}; 

изменения

scanf("%d",&element.age); 
printf("number is: %d",element.age); 

до

scanf("%d",&(element.age[0])); 
printf("number is: %d",element.age[0]); 

, чтобы прочитать в 1-й элемент в возрасте (в сидя с индексом 0), или просто использовать простой int вместо массива

+0

Хорошо спасибо! на самом деле я испортил это, не имел целью создать массив, но если бы я просто сделал: int age; программы выходят из строя. – Saveh

+0

И как я могу заменить? scanf не принимает целую строку, если в ней есть пробелы – Saveh

+0

@Saveh, используйте 'fgets', отредактированный –

2

Я не думаю, что вы имеете в виду, чтобы иметь age собственность как массив из 100 int s; в том случае, если вы не делаете, если вы измените свое struct определение только один int:

struct data{ 
    char name[20]; 
    int age; 
}; 

код, который вы при условии, работает просто отлично. Если вы хотите связать значение возраста, вы не захотите делать это с помощью массива. Использование такого массива означает, что каждый dataobj описывается именем и 100 возрастом. Вместо этого рассмотрите возможность добавления проверки времени выполнения, например:

if (element.age < 0 || element.age > 99) { 
    printf("Bad age value\n"); 
} 
+0

Да, теперь он работает, я не знаю, почему CodeBlocks продолжали раздавить, когда я использовал один var, я пробовал с массивом, и он работал, но забыл изменить код .. теперь его не сбой больше. ура – Saveh

0

в вашем коде рассмотрите это утверждение.

scanf("%d",&element.age); 

Здесь возраст имеет размер массива размером 100 целых элементов. Таким образом, в вашей памяти была создана целая серия из 100 целых чисел, а адрес стартового элемента хранится в другой переменной указателя (в вашем случае возраста). Таким образом, когда вы сканируете значение, вы пытаетесь манипулировать базовым адресом вашего массива, который невозможен. Это происходит под логической ошибкой, которая может быть прослежена только путем понимания. Итак, просто запомните одну вещь.

int age[100] 

Это объявление, в котором компилятор создает указатель и 100 целых переменных (смежных). И адрес первой переменной хранится в указателе, который принимает имя, присвоенное массиву.

Итак, когда вы пытаетесь распечатать его, печатается массив массивов адресов адресов [100].

0

Я думаю, что вы хотите сделать, это хранить вдали возраст в первый элемент вашего возраста массива:

scanf("%d", element.age); 
printf("Age is %d\n", element.age[0]); 

В основном, 99 элементов будет неиспользованными. Другим подходом было бы увеличить значение в массиве возраста, который содержит возраст. Другими словами, если пользователь вводит возраст 30, вы в основном будете делать element.age [29] ++;

Таким образом, вы бы сохранить все 100 значений в нуле, для возраста, что вы хотите, чтобы повысить кроме (возраст пользователь вошел)

Другое дело, что может быть хорошей практикой является использование отдельной переменной при работе с scanf. Например, этот фрагмент кода:

int incoming_age; 
scanf("%d", &incoming_age); 
element.age[0] = incoming_age; 

После того как вы вход отсканированные в переменную incoming_age, вы можете сделать множество вещей с ней. Это может сделать код немного читабельнее.