을받지 않으면 당신은 버퍼에 개행 문자를 입력 한 줄을 읽어 fgets()
을 사용하고 버퍼의 내용을 구문 분석 sscanf()
를 사용할 수 있습니다. 이것에 대해 scanf()
을 사용할 때의 문제점은 대부분의 변환 지정자, 특히 %f
변환 지정자는 줄 바꿈을 포함하여 선행 공백을 건너 뜁니다. 따라서 scanf()
에 빈 줄을 지정하려고하면 함수는 공백이 아닌 문자를 입력 할 때까지 입력을 기다립니다.
아래 코드는이 기술을 사용자 코드에 적용합니다. 변수 n
이 size_t
유형 변수로 변경되었습니다. 이는 배열 색인을 보유 할 수 있도록 보장 된 부호없는 유형이므로 변경되었습니다. 또한 확인해야 할 fgets()
및 sscanf()
반환 값을 유의하십시오. fgets()
함수는 오류가 있으면 null 포인터를 반환하고 아래 코드는 오류 메시지를 인쇄하고이 경우 발생합니다. sscanf()
함수는 성공한 변환 횟수를 반환하며이 값을 사용하여 입력 값이 예상 한 값과 같은지 확인할 수 있습니다. 사용자가 공백 행 또는 선행 부동 소수점 값이없는 행 (선행 공백은 유효)을 입력하면 0이 리턴되고 입력 루프는 이스케이프됩니다.
배열에 입력 된 값을 표시하는 코드를 추가했습니다.
#include <stdio.h>
#include <stdlib.h> // for exit()
int main(void)
{
float scores[10];
char buffer[100];
size_t n = 0;
printf("Enter scores\n");
while (n < 10){
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
fprintf(stderr, "Error in fgets()\n");
exit(EXIT_FAILURE);
}
if (sscanf(buffer, "%f", &scores[n]) == 1) {
++n;
} else {
break;
}
}
for (size_t i = 0; i < n; i++) {
printf("scores[%zu] = %f\n", i, scores[i]);
}
return 0;
}
샘플의 상호 작용 : 파싱 사용자 텍스트
Enter scores
3.8
3.6
2.9
3.4
scores[0] = 3.800000
scores[1] = 3.600000
scores[2] = 2.900000
scores[3] = 3.400000
실제 항목을 코딩 할 때'scanf()'를 사용하지 않아야합니다. –
나는 gets()를 시도하겠다. – mosh442
@ mosh442 : 절대 gets()하지 마라! SO는 건강한 생활 사이트이며'gets()'를 사용하면 건강에 좋지 않은 상태가됩니다. 자,'fgets()'는 전혀 다른 문제입니다. –