2017-01-19 4 views
1

Итак, это мой код:Использование таНос с структуры в C

#include <stdio.h> 
#include <string.h> 
#include <assert.h> 
#include <stdlib.h> 

struct person{ 
    char name[18]; 
    int age; 
    float weight; 
}; 

int main() 
{ 
    struct person *personPtr=NULL, person1, person2; 
    personPtr=(struct person*)malloc(sizeof*(struct person)); 
    assert (personPtr!=NULL); 
    personPtr = &person1;     // Referencing pointer to memory address of person1 

    strcpy (person2.name, "Antony");    //chose a name for the second person 
    person2.age=22;         //The age of the second person 
    person2.weight=21.5;        //The weight of the second person 


    printf("Enter a name: ");    
    personPtr.name=getchar();     //Here we chose a name for the first person 

    printf("Enter integer: ");    
    scanf("%d",&(*personPtr).age);   //Here we chose the age of the first person 

    printf("Enter number: ");    
    scanf("%f",&(*personPtr).weight);  //Here we chose the weithgt of the first person 

    printf("Displaying: ");            //Display the list of persons 
    printf("\n %s, %d , %.2f ", (*personPtr).name, (*personPtr).age,(*personPtr).weight);   //first person displayed 
    printf("\n %s, %d , %.2f",person2.name, person2.age, person2.weight);      //second person displayed 
    free(personPtr); 
    return 0; 
} 

Я получаю две ошибки, и я не знаю, почему. Во-первых, я не думаю, что я выделил право памяти, то первая ошибка на следующей строке:

personPtr=(struct person*)malloc(sizeof*(struct person)); 

Он говорит, что:

[Ошибка] Ожидается выражение до «)» маркера

Вторая ошибка, которую я получаю на линии

personPtr.name=getchar(); 

Почему я не могу попу Запустить имя, используя getchar для структуры? Ошибка:

[Error] запрос 'имя' члена в чем-то не структуры или объединения

+0

'personPtr = таНос (SizeOf (структура человека)) и' personPtr-> имя [0] = GetChar(); ' – MayurK

ответ

7

sizeof*(struct person) является синтаксической ошибкой. Компилятор видит в попытке применить оператора sizeof к *(struct person). Поскольку вы не можете разыменовывать тип, компилятор жалуется. Я думаю, что вы имели в виду, чтобы написать следующее:

personPtr = malloc(sizeof *personPtr); 

Это идиоматических способ выделить то, что personPtr указывает на. Теперь тип указывается только там, где указатель определен, и это хорошо. Вам также не нужно указывать результат malloc, так как void* неявно конвертируется в любой тип указателя.

Вторая ошибка состоит из двух частей:

  1. name является массивом фиксированного размера. Вы не можете назначить массив, используя оператор присваивания. Вы можете назначать только каждому отдельному элементу.

  2. getchar возвращает один символ, а не строку, как вы, кажется, ожидаете. Чтобы прочитать строку, вы можете использовать scanf("%17s", personPtr->name). 17 - это размер вашего буфера - 1, чтобы защитить от переполнения буфера, когда scanf добавляет в строку NUL-терминатор.

+0

я все еще получаю ошибку, даже если я использую зсапЕ: \t [Error] format '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'char (*) [18]' .. С другой стороны, если я удалю & из scanf, программа запустится .. но это дает мне ошибка после окончания –

+0

@NeacsuMihai - Вы правы. Я ошибся в своей поспешности. Теперь исправлено. 'name' является массивом и будет распадаться на правильный тип указателя. Нет '' 'требуется. – StoryTeller

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