2012-01-22 3 views
1
  char yes_no = 'z'; 
      int i = 0; 
      while ((yes_no != 'y') && (yes_no != 'n') ) 
      { 
       read(0, &yes_no, 1); 
       printf("%dA file already exists at your write location. Over write? (y/n)\n", i++); 
      } 

출력은 다음과 같습니다왜 반복마다 메시지가 두 번 인쇄됩니까?

0A file already exists at your write location. Overwrite? (y/n) 
1A file already exists at your write location. Overwrite? (y/n) 
a 
2A file already exists at your write location. Overwrite? (y/n) 
3A file already exists at your write location. Overwrite? (y/n) 

을 ... 등.

매번 사용자 입력을 기다리는 대신 루프를 두 번 통과하는 이유는 무엇입니까?

+3

왜 디버거를 통해 이것을 실행하고 발견하지 않습니까? –

답변

4

한 글자를 입력하고 Enter 키를 누르면 스트림에 'a\n'이 삽입됩니다. 스트림에서 여전히 '\n'으로 남은 1 바이트를 읽음으로써 다음 번에 read()으로 전화하면 사용자 입력을 차단하고 대기하는 대신 '\n'을 읽습니다. 스트림에 남아있는 '\n'을 삭제해야합니다.

+0

위대한, 그냥 2 읽기 바이트 변경 및 작동했습니다. 감사. – Marty

1

아마, y ''를 입력하고 Enter 키를 누르면 버퍼에 문자열 "y \ n"을 넣을 것이므로 두 문자이고 프로그램에서 두 문자 모두를 읽으려고하기 때문일 것입니다.

0

더 많은 코드를 표시해야합니다. (a?를 인쇄 할 때?) 나는 당신이 줄 바꿈도 입력 했으므로 루프의 처음으로 돌아갈 것이라고 생각한다.

0

이것은 직감이지만 입력하는 데이터는 "a \"뿐이므로 "a \"가 아닙니다. 따라서 첫 번째 루프에서는 데이터가 없으므로 블록을 읽습니다. "a"를 입력 한 다음 Enter 키를 누릅니다. 루프가 오류 메시지를 인쇄 한 다음 다시 돌아옵니다. 그러나 이번에는 버퍼에 여전히 개행 문자가 있으며이 문자는 읽지 않고 계속해서 입력을 요청합니다. 그리고 나서 세 번째로 버퍼가 고갈되고 블록을 다시 읽음으로써 더 많은 입력을 기다립니다.

관련 문제