2017-01-11 3 views
-1

함수에서 fgets를 사용하여 C에서 입력을 얻으려고합니다. 코드가 제대로 표시되지만 do/while 루프에 대한 매개 변수를 따르지 않습니다 (외부 번호를 입력하면 입력 범위가 적절할 때까지 루프를 반복하는 것이 아니라 프로그램을 계속 진행합니다. 나는 그것으로 땜질을 시도하고, 나는 나의 문제점이 무엇인지 알 수 없다. 나는 그것이 문자로서의 입력을 정수로 취하는 것과 관련이있을 것이라고 생각한다. 하지만 int에 변수를 넣으려고했는데 도움이되지 않았습니다. 어떤 도움이라도 대단히 감사합니다!C에서 입력에 fgets 사용하기

{ 
char line[MAX_LINE]; 

int entry; 

    do 
    { 
    printf("Please enter %s(%d-%d) ", descriptionCPtr, low, high); 
    fgets(line, MAX_LINE, stdin); 
    entry = (int)line[0]; 
    } 

    while(entry < low || entry > high); 
    return(entry); 
} 
+0

기본 디버깅을 수행 했습니까? 디버거를 사용하거나'line'과'entry' 값을 출력하는 것과 같은 것입니까? 확실히 당신은 도움을 요청하기 전에 문제에 대해 더 많이 알 수 있습니다. – kaylum

+0

예. 나는 진입 가치를 인쇄했고 나에게 "45"또는 "52"를 계속 제공한다. 그것이 어디에서오고 있는지, 줄은 나에게 119054520을 준다. – Polyphase29

+2

글쎄, 왜 그 정보를 제공하지 않았고, while 루프가 아닌 그것에 대해 물어 보았다. 분명히'entry'는 여러분이 기대하는 것이 아니며 그것은 실패의 초기 지점입니다. 캐스팅이하는 일을 복습 해 보는 것이 좋습니다. 문자열을 'int'문자열로 변환 할 수 없습니다. 그런 다음 [atoi] (https://linux.die.net/man/3/atoi)를 찾으십시오. – kaylum

답변

0

직감이 정확합니다. 사용자 입력을 숫자 값으로 올바르게 변환하지 못했습니다. fgets은 사용자 입력을 읽고 \n과 함께 line 변수에 저장합니다. 문자 배열. 사용자가 자신의 나이에 들어가는 노인이라고 가정 해 보겠습니다. line9, 9, \n\0 문자의 배열입니다. 그러나 다음 줄에서는 문자 9 (ASCII 코드 57 포함)을 정수로 변환하고 entry에 57을 할당하여 line[0]을 캐스팅합니다. 글쎄요, 아마도 여기에서 성취하려고하는 것이 아닙니다.

이 경우 권장되는 해결책은 fgets 대신 scanf을 사용하는 것입니다.

int age; 

scanf("%d", &age); 
if (age < min_age || age > max_age) 
    printf("age not valid\n"); 

이는 fgets을 고수 할 경우, 새 라인 문자를 제거하고 정수로 line 변환 (그런데 정말 안전하지 않은) atoi처럼 호출 기능 캐스팅을 교체합니다.