2014-10-11 4 views
3

나는 주변을 둘러 보았고 오류가있는 곳을 찾을 수없는 것 같습니다. 나는 그것이 내가 fgets를 사용하는 방식과 관련이 있어야한다는 것을 알고 있지만, 나는 그것이 무엇인지 내 삶에 대해 알 수 없다. 필자는 fgets와 scanf를 섞어서 오류를 생성 할 수 있기 때문에 두 번째 scanf를 fgets로 변경하고 여전히 나머지 입력을 건너 뛴 다음 첫 번째 만 인쇄합니다.Fgets 건너 뛰기 입력

int addstudents = 1; 
char name[20]; 
char morestudents[4]; 

for (students = 0; students<addstudents; students++) 
{ 
    printf("Please input student name\n"); 
    fgets(name, 20, stdin); 
    printf("%s\n", name); 
    printf("Do you have more students to input?\n"); 
    scanf("%s", morestudents); 
    if (strcmp(morestudents, "yes")==0) 
    { 
    addstudents++; 
    } 
} 

입력 사항은 Joe, yes, Bill, yes, John, no입니다. 첫 번째 fgets 대신 scanf를 사용하면 모두 계획대로 진행되지만 공백이 포함 된 전체 이름을 사용하고 싶습니다. 내가 어디로 잘못 가고 있니?

답변

5

프로그램에 Do you have more students to input?이 표시되고 yes을 입력 한 다음 콘솔에서 Enter 키를 누르면 \n이 입력 스트림에 저장됩니다.

입력 스트림에서 \n을 제거해야합니다. 그렇게하려면 getchar() 함수를 호출하면됩니다.

scanffgets을 함께 사용하지 않는 것이 좋습니다. scanf에는 많은 문제가 있으며, fgets을 더 잘 사용하십시오.

Why does everyone say not to use scanf? What should I use instead?

이 예를보십시오 :

#include <stdio.h> 
#include <string.h> 
int main (void) 
{ 
    int addstudents = 1; 
    char name[20]; 
    char morestudents[4]; 
    int students, c; 
    char *p; 
    for (students = 0; students<addstudents; students++) 
    { 
     printf("Please input student name\n"); 
     fgets(name, 20, stdin); 
     //Remove `\n` from the name. 
     if ((p=strchr(name, '\n')) != NULL) 
      *p = '\0'; 
     printf("%s\n", name); 
     printf("Do you have more students to input?\n"); 
     scanf(" %s", morestudents); 
     if (strcmp(morestudents, "yes")==0) 
     { 
      addstudents++; 
     } 
     //Remove the \n from input stream 
     while ((c = getchar()) != '\n' && c != EOF); 
    } 
    return 0; 
}//end main 
+0

브릴리언트을! 감사! – user3591385

+2

나는 다음을 보길 원합니다.'int c; while ((c = getchar())! = EOF && c! = '\ n');'여기서 루프 본문의 세미콜론은 자체적으로 한 행에 있습니다. 이것은 사용자가'예'를 입력하거나 입력의 끝에 공백을 넣으면 당신을 보호합니다. 이 경우'char c '대신'int c'를 사용하는 것이 중요합니다. 원래의 코드에서는'c'를 사용하지 않습니다. (왜냐하면 내 기본 컴파일러 옵션은 설정되었지만 사용되지 않는 변수에 대해 불평 할 것이므로 여기서 코드를 사용하면'(void) getchar();)로 끝날 것입니다. 따라서 'EOF'와 유효한 문자를 확실하게 구별 할 수 없다는 사실은 중요하지 않습니다. –

+0

@JonathanLeffler : 내 게시물에 대한 개선 제안을 보내 주시면 다행입니다. 감사합니다 :) 당신이 제안한대로 변경했습니다. 사용자가 '예'라고 입력하면 업데이트 된 변경이 적용됩니다. – user1336087