2009-07-02 5 views
4

"point % d % d"와 같은 형식으로 행을 일치 시키려고합니다. 따라서 두 개의 정수가 두 개만 필요하며 "점"은 형식 문자열에 하드 코딩됩니다. scanf의 Linux man 페이지를 읽는 것을 이해 했으므로 제대로 작동합니다.scanf 형식의 하드 코드 된 문자열

다음 코드는 scanf에 대한 첫 번째 호출이 작동하지만 다음 호출 scanf는 오류 코드와 함께 반환되며 stdin에서 더 많은 숫자를 가져 오지 않습니다 (scanf는 더 많은 입력을 기다리는 것을 차단하지 않습니다.) 표준 입력 : 이런 식으로

for (;;) 
{ 
    scanf("point %d %d", &x, &y); 
    printf("=> point %d %d\n", x, y); 
} 

, 모든 작업은 예상대로 :

int x, y; 
    char s[10]; 

    for (;;) 
    { 
     scanf("%s %d %d", s, &x, &y); 
     printf("=> point %d %d\n", x, y); 
    } 

내가 오해하고 수 있는지에 대한 어떤 제안?

감사합니다.

답변

3

stdin에 줄 끝 문자와 같이 아직 사용되지 않은 데이터가있어 향후 스캔이 일치하지 않는 것으로 중지하게됩니다. 두 번째 버전에서는이 최종 줄 데이터가 %s에 의해 소비됩니다.

나는 먼저 fgets을 버퍼에 제안한 다음 sscanf을 제안합니다. 그리고 반환 값을 확인하십시오.

+1

좋아, 내 문제를 해결하는 말, 고마워. 이제 scanf ("point % d % d", & x, &y);)를 "stdin"의 줄 끝 문자를 꺼내기 전에 * blank *로 호출하면됩니다. – Ricardo

1

내 생각에 적절한 입력을 제공하지 않는 것 같습니다.

point 4 5 

당신은 오류 코드를 언급하지 않았다, 그러나 아마 당신이 (제대로 형식을 따르지 않았다고 말하고있다 :

4 5 

이 작동합니다 : 예를 들어이 입력이 작동하지 않습니다 즉 숫자 앞에 점을 찍는다).

+0

예, scanf는 두 개의 숫자와 일치하기 전에 "point"와 일치해야합니다. 두 번째 예에서 % s는 빈 문자열과 일치합니다. –

+0

또한 줄 바꿈도 신경 쓸 필요가 없습니다. –

+0

글쎄, 분명히 나는 ​​"point 4 5"와 같은 stdin 라인을 사용하고있다. 그래서 형식에 문제가 없으며, 지금까지 입력에 오류를 감지하고 싶지도 않습니다. 그래서 표준 입력란의 첫 번째 줄 (예 : "point 4 5")에서 제대로 작동하고 4와 5를 얻습니다. 반환 코드는 2 (두 요소 가져옴)입니다. 두 번째 줄 (올바른 형식이 비슷한 줄)에서 none을 선택하면 scanf가 stdin에서 더 많은 입력을 기다리는 것을 차단하지 않으며 반환 코드는 항상 0입니다 (요소가 없으므로 오류가 있음을 알 수 있습니다) . – Ricardo

0

사용자로부터 입력을 받기 전에 표준 입력을 플러시해야합니다.

+0

어떻게 이식 할 수 있습니까? 예를 들어 fflush는 출력 스트림에서만 작동하도록 보장되지만 입력 스트림을 fflush하면 어떤 입력이든 무시합니다. – laalto

+0

fflush (stream)은 출력 전용이므로 읽으십시오 -> "왜 fflush (stdin) 잘못되었습니다 "-> http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351 – Ricardo

+0

일부 컴파일러에서는이 정의되지 않은 동작입니다 동의합니다. 기본적으로 입력" 모든 보류중인 입력 스트림이므로 정크 입력없이 다시 읽기 시작할 수 있습니다. msvn에 따르면 fflush를 구현하면 전달 된 모든 스트림이 지워지기 때문에 MSVC++에서 작동합니다. 그러나 이것은 정의 된 동작이 아니기 때문에 모든 컴파일러에서 작동하지 않습니다. 이것은 ANSI 표준위원회가 입력 스트림을 플러시 할 때 일어날 일을 지정하지 않았 음을 의미합니다. – Vaibhav

관련 문제