2014-09-03 2 views
0

다음 코드가 있습니다. 구조체 정의에서, 나는 사용자에게 직원의 성과 이름을 입력하도록 요청합니다. 그러나이 exe를 실행하면 제목이 입력 된 후에 종료됩니다. 어떤 제안?gets()에 전달할 때 struct에서 포인터를 사용하는 것이 잘못된 이유는 무엇입니까?

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

#define NUMEMPS 10 

struct Employee { 
char *firstname; 
char *lastname; 
char *title; 
int salary; 
}; 

int main() 
{ 
struct Employee* stuff = malloc(NUMEMPS* sizeof *stuff); 
int n,i; 
for (n=0; n<NUMEMPS;n++) 
{ 
    printf("Please enter number %d Employee's Last name:", n); 
    fflush(stdout); 
    gets(stuff[n].lastname); 
    if (strlen(stuff[n].lastname) == 0) 
    break; 
    printf("Please enter number %d Employee's first name:", n); 
    fflush(stdout); 
    gets(stuff[n].firstname); 
    printf("Please enter number %d Employee's title:", n); 
    fflush(stdout); 
    gets(stuff[n].title); 
    printf("Please enter number %d Employee's salary:", n); 
    fflush(stdout); 
    scanf("%d", &stuff[n].salary); 
    getchar(); 
    } 
    for (i = 0;i<n;i++) 
    { 
    printf("{%s,%s,%s,%d}\n", 
     stuff[i].lastname, 
     stuff[i].firstname, 
     stuff[i].title, 
     stuff[i].salary); 
    } 
    return 0; 
    } 
+0

'gets()'를 사용하지 마십시오. 더 이상 표준 C의 일부가 아니며 다른 문제와 관계없이 사용하기에 절대 안전하지 않습니다. 'fgets()'또는'getline()'대신에 결과 문자열에 구분 기호 (개행)를 포함하고있는 반면에'gets()'는 그것을 제외한다는 것을 기억하십시오. 그리고 모든 입력 작업의 결과를 확인하십시오. –

+1

@JonathanLeffler : [http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html] ('getline')은 POSIX에 의해 정의되지만 C 표준에 의해 정의되지는 않습니다. 모든 시스템에 존재하지 않거나 동일한 이름의 다른 기능이있을 수 있습니다. –

+0

@KeithThompson : 예; 그 이유는'fgets()'를 먼저 쓰는 이유인데, 평소와 같이 URL을 포함시키지 않았거나 명시 적으로'getline()'을 POSIX 전용으로 호출하지 않았다는 것을 인정합니다. 이 줄에 관한 –

답변

2

구조의 세 char* 부재 때문에 공백이있는 데이터를 보유하도록 할당되지 포인터이다. 현재 struct

은 데이터 세 이상 allocs을해야 할 것입니다 : 당신이 아마 원하는 것은 같은 것입니다

struct Employee* stuff = malloc(NUMEMPS* sizeof *stuff); 
stuff->firstname = malloc(101); 
stuff->lastname = malloc(101); 
stuff->title = malloc(101); 

: 또한

struct Employee { 
    char firstname[101]; 
    char lastname[101]; 
    char title[101]; 
    int salary; 
    }; 

제쳐두고 불구하고로서, malloc 호출이 NULL 반환을 확인해야합니다.

+0

크기는 원하는대로하거나 적절하다고 판단합니다. 방금 101 번을 선택했습니다 (100 바이트의 데이터와 널 터미네이터 허용). –

1

이 코드 :

struct Employee { 
char *firstname; 
char *lastname; 
char *title; 
int salary; 
}; 

...

struct Employee* stuff = malloc(NUMEMPS* sizeof *stuff); 

단 하나의 struct Employee을 저장하기에 충분한 공간을 할당, 즉 세 가지 포인터와 정수. 을 가리키는 문자열이 저장되지 않았습니다.

각 구성 문자 데이터를 stuff->firstname (그 외)에 할당하거나 문자 배열을 포함하도록 struct Employee의 선언을 수정하십시오.

+0

-1 malloc에는 Employee 구조체의 공간이 포함되어 있지 않기 때문에 Employee – user3629249

+0

@ user3629249 구조체에 대한 10 개의 포인터가 있으므로 사용자가 정답을주의 깊게 읽지는 못했습니다.이 질문에 인용 된 코드는이 대답에서 제안되지 않았습니다. "이 코드는 ... ... 인용 된 코드 ..." –