scanf ()는 버퍼에 새 줄 문자를 남깁니다.
다음 프로그램이 있습니다.
int main(int argc, char *argv[])
{
int a, b;
char c1, c2;
printf("Enter something: ");
scanf("%d",&a); // line 1
printf("Enter other something: ");
scanf("%d", &b); // line 2
printf("Enter a char: ");
scanf("%c",&c1); // line 3
printf("Enter another char: ");
scanf("%c", &c2); // line 4
printf("Done"); // line 5
system("PAUSE");
return 0;
}
내가 C 책을 읽었을 때 저자는 scanf()
버퍼에 줄 바보 문자 를 남겼습니다 위해 프로그램은 사용자가 데이터를 입력하고 다음으로 이동합니다. 5 행.
맞습니까?
그러나이 char
데이터 유형 은에서만 발생합니까? int
1, 2, 3 행에서 와 같이 데이터 유형에 대해보고하는 문서입니다. 맞습니까?
이 함수는 문자 이외의 변환을 구문 분석하기 전에 공백을 자동으로 제거합니다. 문자 형식 (주로 , 스캔 세트 — 및 )은 예외입니다. 공백을 제거하지 않습니다.scanf()
%c
%[…]
%n
" %c"
공백을 건너 뛰려면 먼저 공백과 함께 사용하십시오 . scanf()
형식은 에 후행 공백을 사용하지 않습니다 .
참고이 아직도 입력 스트림에 남아 후행 공백 을 소비하지 않도록 , 심지어 라인의 단부에, 또한 그 경우 그래서 사용 조심 또는 동일한 입력 입력 스트림. 우리는 변환 전에 공백을 건너 뛰도록 뛰도록 scanf를 받고 있습니다.getchar()
fgets()
%d
리터럴 텍스트와 같이 변환 이외의 공백이 아닌 "지시문"( POSIX scanf 용어 사용 ) scanf("order = %d", &order);
은 공백도 건너 뛰기 뛰지 언어. 리터럴 order
은 읽을 다음 문자와 일치해야합니다.
따라서 " order = %d"
이전 줄에서 줄 바꿈을 건너 뛰고 싶지만 여전히이 질문과 같이 고정 필요한에 대한 리터럴 일치가 필요한 거기를 원할 것입니다 .
사용 scanf(" %c", &c2);
. 이것은 당신의 문제를 해결하는 것입니다.
여기 에서 얻은 또 다른 옵션 은 할당 옵션 을 사용하여 개행을 읽고 버리는 것 입니다. 이를, 우리는 단지 사이 별표 문자 읽기 형식을 넣어 %
및 c
:
scanf("%d%*c",&a); // line 1
scanf("%c%*c",&c1); // line 3
scanf
그런 다음 다음 문자 (즉, 개행)를 읽지 만 포인터에 할당하지 않습니다.
그러나 결국 저는 FAQ의 마지막 옵션을 두 번째로하겠습니다 .
또는 요구 사항에 따라 scanf () / getchar ()를 잊어 버리고 fgets ()를 사용하여 사용자로부터 텍스트 줄을 가져와 직접 구문 분석 할 수도 있습니다.
getchar()
두 번째 호출 전에 사용하십시오 scanf()
.
scanf("%c", &c1);
getchar(); // <== remove newline
scanf("%c", &c2);
참고 URL : https://stackoverflow.com/questions/5240789/scanf-leaves-the-new-line-char-in-the-buffer
'ProgramingTip' 카테고리의 다른 글
정적 vs 글로벌 (0) | 2020.11.18 |
---|---|
Java로 여러 인터페이스 구현-위임하는 방법이 있습니까? (0) | 2020.11.18 |
bash를 호출하고 새 셸 내에서 명령을 실행 한 다음 사용자에게 제어권을 다시 제공하는 방법은 무엇입니까? (0) | 2020.11.18 |
C ++ 람다 식의 수명은 얼마입니까? (0) | 2020.11.18 |
catch를 시도해보십시오. (0) | 2020.11.18 |