2017-12-03 19 views
0

구조를 사용하여 데이터를 입력하는 간단한 프로그램을 작성하고 싶습니다.구조체 배열; 여러 문자열 입력

내 원래 프로그램은 다음과 같이 보았다 :

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

struct student { 
    int num; 
    char name[20]; 

}; 

int main() 
{ 
    int size, i; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", &s[i].name); 

    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 

    } 

    return 0; 
} 

내 테스트 입력은 다음과 같습니다

2 
1 Name1 
2 Name2 

그것은 작동했지만 데이터가 올바르게 입력 한 경우에만 사용할 수 있습니다. 하지만 내 구조에서 더 많은 문자열을 사용하려고하면 엉망이되기 시작했습니다. 이 같은 예를 들어 뭔가가 작동하지 않습니다를 들어 :

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

struct student { 
    int num; 
    char name[20]; 
    char gender; 
    char address[20]; 
}; 

int main() 
{ 
    int size, i, j; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", s[i].name); 
     scanf("%s", s[i].gender); 
     scanf("%s", s[i].address); 
    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 
     printf("gender:%s\n", s[i].gender); 
     printf("address:%s\n", s[i].address); 
    } 

    return 0; 

}

은 내가 getchar가를 사용하려고, 그래서 그 문제는 문자열 입력을 scanf와의 사용에 두어야 이해(). 나는 이런 일이 효과가있을 것이라고 생각했다.

for(i=0; i < size; i++){ 
     int j=0; 
     while((s[i].name[j]=getchar()) != ' '); 
      j++; 
     s[i].name[j] = '\0'; 
} 

그래도 작동하지 않습니다. 이 시점에서 나는 혼란스러워서 무엇이 잘못되었는지를 잘 모릅니다. 제프 M No.2_road_city

1001

구조를 사용하여,하지만 난 그것을 수행하는 방법을 정확히 혼란 받고 있어요 : 나는 같은 입력 뭔가하고 싶은 말은.

+1

을 경고 사용 첫 번째 단계는 전에 유래에 질문입니다'는 scanf ("% s '에, S [I] scanf ("% s", s [i] .gender);'=>'scanf ("% s", s [i] .name);' >'scanf ("% c", & s [i] .ge) – Stargateur

+1

각각의'scanf()'호출이 올바른 번호 (각 호출에서 하나의 필드를 읽을 때 1)를 반환하는지 확인하십시오. 1을 반환하지 않으면 문제가 발생합니다. N 개의 통화를 하나의 통화로 결합하는 것이 더 나을 것입니다. 그렇게 할 수 있습니다. ['fgets()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) 또는 POSIX ['getline()'] (http : /pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) 그리고'sscanf()'로 라인을 처리하십시오. –

답변

-1

그것은 키보드 버퍼를 지우는는 scanf에게 ("% s '에 ... 을 사용하기 전에 fflush(stdin); 을 넣어. 연속 2는 scanf 문을 첫 번째 입력에서 줄 바꿈/캐리지 리턴을 포함하는 두 번째 버퍼를 원인 플래시는 실시하지 않고 단지

또 다른 문제 :... 당신이 문자 변수 (문자 성별)에 대한 scanf("%s" 사용 scanf("%c",&s[i].gender);로 변경

+0

'fflush (stdin);'은 정의되지 않은 동작입니다. – Stargateur

+0

정확히 일치하지 않습니다. 읽기 (마지막 게시) https://stackoverflow.com/questions/2979209/using-fflushstdin –

+0

"표준 C와 POSIX는 정의되지 않은 동작으로 fflush (stdin)을 그대로 둡니다"라는 말이 사실입니다. – Stargateur