2014-12-20 2 views
0

저는 C를 공부하는 학생으로서 구조 및 배열을 사용하여 문자를 배열의 일부로 읽을 때 막혀있는 것처럼 보입니다.구조체에서 scanf에 char을 사용할 때 문제가 발생했습니다.

코드를 실행하면 char scanf를 건너 뛰고 문자를 읽지 않습니다. 정수 등에서 아무런 문제가 없습니다.

예를 들어 (이 코드는 훨씬 길지만 여기에 문제가 있음을 알고 있습니다). 이름을 읽는 scanf 부분이 맞습니까?

struct stud s[5]; 
int i = 0; 
for (int i = 0; i < 5; i++) 
{ 
    fflush(stdout); 
    s[i].no = i + 1; 
    printf("\nStud number %d\n", s[i].no); 
    printf("Enter name:"); 
    scanf_s("%c", &s[i].name); 
    printf("Enter grade: "); 
    scanf_s("%d", &s[i].grade); 
    printf("Successfully added to grade book\n"); 
} 

나는 아래를 선언 누군가가 올바른 방향으로 날 지점 수 있다면

struct stud { 
    int no; 
    char name; 
    int grade; 
}; 

그것은 좋은 것?

+0

어떻게 될 것으로 예상 되나, 대신에 무슨 일이 일어 났습니까? – ace

+0

이 줄은 : printf ("이름 입력 :"); 하나의 문자 만 읽히기 때문에 아마도 다음과 같아야합니다 : printf ("첫 번째 문자 입력 :"); – user3629249

답변

2

적절한 크기의 char 배열을 만들고 학생들에게 1 문자 이상을 입력하려는 경우 @iharob에서 설명한대로 %s을 사용해야합니다. 당신이 charname을 원하는 경우, 다음 스캔 할 stdin%c에 존재 %c 건너 뜀 (줄 바꿈 및 공백 등) 공백의 모든 종류의 전에

scanf_s("%c", &s[i].name); 

으로
scanf_s(" %c", &s[i].name, 1); 

공간을 변경 비 공백 문자.

+1

'scanf_s ("% c")'다음 인수가 필요합니다. – chux

+0

나는 그것을 몰랐습니다! 그러나 [이 사이트] (http://code.wikia.com/wiki/Scanf_s)에는 약 2 개의 논쟁에 대한 언급이 없습니다. 해당 사이트가 잘못 되었다면'scanf_s ("% c", & s [i] .name, 1); –

+0

[ms 샘플] (http://msdn.microsoft.com/en-us/library/w40768et.aspx)는'scanf_s ("% 4c", & c, _countof (c));를 사용합니다. '_countof (c) '의 타입처럼'scanf_s'를 사용합니다. – chux

3

당신은

struct room { 
    int no; 
    char name[32]; /* pick a reasonable size */ 
    int grade; 
}; 

그리고 다음이

scanf_s("%c",&s[i].name); 

scanf_s("%s",s[i].name, _countof(s[i].name)); 

로 변경 것 char 배열로 name를 선언해야하고 보장이 없기 때문에 즉, name 것 be 31 charac이되어야합니다. TERS 길이, 당신은 C 문자열은 null 바이트 '\0'와 문자열의 끝을 표시 할 필요가 있기 때문에 길이가 sizeOfArray - 1해야이

scanf_s("%31s",s[i].name, _countof(s[i].name)); 

같은 필드 길이를 지정해야하고, scanf_s는 해당 바이트를 추가합니다 문자열을 읽습니다.

필드 길이를 지정하지 않고 _countof(s[i].name)보다 많은 문자가있는 것으로 판명 된 경우 아무 것도 읽지 않습니다. 자세한 내용은 here을 참조하십시오.

+3

['_countof()'] (http://msdn.microsoft.com/en-us/library/ms175773.aspx)는 표준 C (Microsoft 확장)가 아니며'scanf_s()'가 정의되어있는 반면 C11 표준의 부속서 K에서는 광범위하게 구현되지 않았습니다 (Microsoft와 함께 제공되며 유닉스 계열 시스템에서는 일반적으로 제공되지 않습니다). –

+0

@JonathanLeffler : Annex K'scanf_s'와 MS'scanf_s'는 호환되지 않습니다. Annex K 버전의 크기 매개 변수는 'size_t'유형이고 MS 버전의 경우 'int'입니다. variadic 함수에서. – mafso

+0

@mafso : 내가 [놀랐다]라고 말할 수 있었으면 좋겠다. (http://stackoverflow.com/a/373911/15168). 나는 snprintf_s()와 관련된 이슈를 알고 있었다. 필자는'scanf_s()'문제를 특별히 알고 있지 않았습니다. –

2

%c은 문자가 stdin에 있기 때문에 해당 문자를 건너 뛰지 않아야합니다. 이전의 마지막 문자가 \n 경우

scanf_s("%c", &s[i].name); 

%c는 입력으로 \n를 취할 것입니다. 코드를 변경해야합니다. %c 앞에 공백을 둡니다.

scanf_s(" %c", &s[i].name); 

이것은 stdin의 공백 문자를 플러시하고 그것은 입력을 얻을 것이다.

관련 문제