// Some initialization code
dup2(fd[0], fileno(stdin));
// This process is receiving the output of "ls -1"
while (scanf("%[^\n]s", someCharArray) > 0) {
scanf("%*c");
printf("%s\n", someCharArray);
}
그러면 모든 파일이 성공적으로 인쇄됩니다. 그러나 루프는 종료되지 않습니다. 제거하면 scanf("%*c")
종료되지만 첫 번째 파일 이름 만 인쇄됩니다.
개행 문자를 사용하면 외부 scanf
가 다음 파일 이름을 스캔 하도록 준비 할 것으로 예상됩니다 . 그러나 최종 파일 이름을 스캔 한 후에는 중첩 된 파일이 scanf
아무것도 스캔하지 않을 것으로 예상합니다 . 그런 다음 외부 scanf
도 아무것도 스캔하지 않습니다. 그리고 while 루프가 종료됩니다.
왜 이런 일이 발생합니까?
루프는 더 많은 입력을 기다리고 있으므로 종료되지 않습니다.
당신은 할 수 있습니다
두 번째 스캔에 실패 \n\n
하므로 쌍을 보내 scanf("%[^\n]...
0을 반환 \n
하거나
close stdin
(구현 특정 방식으로) 그래서 scanf()
반환 EOF
, 음수.
사용하는 것이 좋습니다 fgets()
. @WhozCraig 루프가 종료되기를 원하는 조건 ( stdin
닫기 제외) 이 아직 명확하지 않지만 .
while (fgets(someCharArray, sizeof someCharArray, stdin)) {
// Lop off potential trailing \n if desired
someCharArray[strcspn(someCharArray, "\n")] = '\0';
printf("%s\n", someCharArray);
}
참고 : "s"
in scanf("%[^\n]s", someCharArray)
은 목적이 없습니다. 또한 너비가없는이 형식은 스캔되는 최대 문자 수를 제한하지 않으며 someCharArray
품질 코드에 사용해서는 안됩니다.
개행 문자를 사용하면 외부 scanf가 다음 파일 이름을 스캔하도록 준비 할 것으로 예상됩니다.
예-맞습니다. 이전 scanf("%[^\n]...
에는 정의되지 않은 동작 (UB)으로 이어질 수있는 스캔 문자 수에 제한이 없습니다. 그렇다면 나머지 코드가 동작 할 것으로 예상하는 이유는 무엇입니까?
그러나 최종 파일 이름을 스캔 한 후에는 중첩 된 scanf가 아무것도 스캔하지 않을 것으로 예상합니다.
최종 최종 파일 이름 '\n'
뒤에가 있으면에서 scanf("%*c");
사용합니다. 최종 파일 이름에 다음 문자가 없으면 scanf("%*c");
참을성있게 문자를 기다립니다. 입력 스트림이 EOF
닫히면 대기하는 대신 반환 됩니다. 코드는 결과를보고 / 테스트하지 않으므로 scanf("%*c");
추측 할 수 있습니다.
그런 다음 외부 scanf는 아무것도 스캔하지 않습니다. 그리고 while 루프가 종료됩니다.
True, 스캔 할 첫 번째 문자가 a '\n'
이면에 남아 stdin
있고 scanf()
0을 반환합니다. stdin
닫혀 있으면 scanf()
음수를 반환합니다 EOF
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다