개행 문자를 사용할 때 scanf while 루프가 종료되지 않는 이유는 무엇입니까?

Ludluck
// 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 루프가 종료됩니다.

왜 이런 일이 발생합니까?

chux-모니카 복원

루프는 더 많은 입력을 기다리고 있으므로 종료되지 않습니다.

당신은 할 수 있습니다

  1. 두 번째 스캔에 실패 \n\n하므로 쌍을 보내 scanf("%[^\n]...0을 반환 \n하거나

  2. 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

while 루프를 사용할 때 외부 변수가 변경되지 않는 이유는 무엇입니까?

분류에서Dev

숫자를 검색 할 때 int while 루프가 계속 진행되는 이유는 무엇입니까?

분류에서Dev

종료 된 하위 명령으로 파이핑 할 때 bash while 루프가 종료되지 않는 이유는 무엇입니까?

분류에서Dev

내가 0 미만일 때 while 루프가 종료되지 않는 이유는 무엇입니까?

분류에서Dev

명령 대체를 사용할 때 개행 문자가 손실되는 이유는 무엇입니까?

분류에서Dev

C의 While 루프는 Repl.it에서 종료되지만 gcc를 사용하여 로컬에서 실행될 때는 종료되지 않습니다.

분류에서Dev

C ++ : Ctrl + d를 사용하여 입력 루프를 종료 할 때 마지막 입력이 선택되지 않는 이유는 무엇입니까?

분류에서Dev

사용자가 특정 문자열을 입력 할 때 while 루프를 종료하는 방법은 무엇입니까?

분류에서Dev

'exit'문자열을 확인할 때 내 코드가 루프 내에서 종료되지 않는 이유는 무엇입니까?

분류에서Dev

while 루프가 종료되지 않는 이유는 무엇입니까?

분류에서Dev

내 PLSQL 코드가 while 루프를 사용하여 루핑되지 않는 이유는 무엇입니까?

분류에서Dev

for 및 while 루프를 사용할 때 다른 결과가 나타나는 이유는 무엇입니까?

분류에서Dev

사용자가 입력 한 문자열로 do while 루프를 종료하는 방법은 무엇입니까?

분류에서Dev

while 루프를 계속할 때마다 변수가 재설정되는 이유는 무엇입니까?

분류에서Dev

while 루프가 작동하지만 내 값을 반환 할 때 if 문이 아닌 이유는 무엇입니까?

분류에서Dev

Await.result를 수행 할 때 Scala Async 테스트가 완료되지 않는 이유는 무엇입니까?

분류에서Dev

사용자가 scanf ()에 잘못된 데이터 유형을 입력 할 때 무한 루프를 수정하는 방법은 무엇입니까?

분류에서Dev

scanf () 및 printf ()를 사용하는 동안 else 문이 실행되지 않는 이유는 무엇입니까?

분류에서Dev

scanf를 사용할 때 공백이 enter와 같지 않은 이유는 무엇입니까?

분류에서Dev

Tcplistener 수신 반복기를 사용할 때 for 루프가 종료되지 않는 이유

분류에서Dev

ForkJoinPool을 사용할 때 다음 응용 프로그램이 즉시 종료되지만 ThreadPoolExecutor를 사용할 때는 왜 종료되지 않습니까?

분류에서Dev

! = 연산자를 사용할 때 Google Analytics가 분할되지 않는 이유는 무엇입니까?

분류에서Dev

함수에서 반환 된 변수를 평가할 때 내 "while"루프가 끝나지 않는 이유는 무엇입니까?

분류에서Dev

사용자가 특정 정수를 입력 할 때 while 루프를 올바르게 종료하는 방법

분류에서Dev

프록시를 사용할 때 인터셉터가 호출되지 않는 이유는 무엇입니까?

분류에서Dev

std :: string :: operator []를 사용할 때 자동 변수가 참조가되지 않는 이유는 무엇입니까?

분류에서Dev

while 루프가 끝날 때까지 UI가로드되지 않는 이유는 무엇입니까?

분류에서Dev

응용 프로그램을 종료 할 때 개체를 삭제하는 이유는 무엇입니까?

분류에서Dev

PC를 종료 할 때 마우스의 LED가 꺼지지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    while 루프를 사용할 때 외부 변수가 변경되지 않는 이유는 무엇입니까?

  2. 2

    숫자를 검색 할 때 int while 루프가 계속 진행되는 이유는 무엇입니까?

  3. 3

    종료 된 하위 명령으로 파이핑 할 때 bash while 루프가 종료되지 않는 이유는 무엇입니까?

  4. 4

    내가 0 미만일 때 while 루프가 종료되지 않는 이유는 무엇입니까?

  5. 5

    명령 대체를 사용할 때 개행 문자가 손실되는 이유는 무엇입니까?

  6. 6

    C의 While 루프는 Repl.it에서 종료되지만 gcc를 사용하여 로컬에서 실행될 때는 종료되지 않습니다.

  7. 7

    C ++ : Ctrl + d를 사용하여 입력 루프를 종료 할 때 마지막 입력이 선택되지 않는 이유는 무엇입니까?

  8. 8

    사용자가 특정 문자열을 입력 할 때 while 루프를 종료하는 방법은 무엇입니까?

  9. 9

    'exit'문자열을 확인할 때 내 코드가 루프 내에서 종료되지 않는 이유는 무엇입니까?

  10. 10

    while 루프가 종료되지 않는 이유는 무엇입니까?

  11. 11

    내 PLSQL 코드가 while 루프를 사용하여 루핑되지 않는 이유는 무엇입니까?

  12. 12

    for 및 while 루프를 사용할 때 다른 결과가 나타나는 이유는 무엇입니까?

  13. 13

    사용자가 입력 한 문자열로 do while 루프를 종료하는 방법은 무엇입니까?

  14. 14

    while 루프를 계속할 때마다 변수가 재설정되는 이유는 무엇입니까?

  15. 15

    while 루프가 작동하지만 내 값을 반환 할 때 if 문이 아닌 이유는 무엇입니까?

  16. 16

    Await.result를 수행 할 때 Scala Async 테스트가 완료되지 않는 이유는 무엇입니까?

  17. 17

    사용자가 scanf ()에 잘못된 데이터 유형을 입력 할 때 무한 루프를 수정하는 방법은 무엇입니까?

  18. 18

    scanf () 및 printf ()를 사용하는 동안 else 문이 실행되지 않는 이유는 무엇입니까?

  19. 19

    scanf를 사용할 때 공백이 enter와 같지 않은 이유는 무엇입니까?

  20. 20

    Tcplistener 수신 반복기를 사용할 때 for 루프가 종료되지 않는 이유

  21. 21

    ForkJoinPool을 사용할 때 다음 응용 프로그램이 즉시 종료되지만 ThreadPoolExecutor를 사용할 때는 왜 종료되지 않습니까?

  22. 22

    ! = 연산자를 사용할 때 Google Analytics가 분할되지 않는 이유는 무엇입니까?

  23. 23

    함수에서 반환 된 변수를 평가할 때 내 "while"루프가 끝나지 않는 이유는 무엇입니까?

  24. 24

    사용자가 특정 정수를 입력 할 때 while 루프를 올바르게 종료하는 방법

  25. 25

    프록시를 사용할 때 인터셉터가 호출되지 않는 이유는 무엇입니까?

  26. 26

    std :: string :: operator []를 사용할 때 자동 변수가 참조가되지 않는 이유는 무엇입니까?

  27. 27

    while 루프가 끝날 때까지 UI가로드되지 않는 이유는 무엇입니까?

  28. 28

    응용 프로그램을 종료 할 때 개체를 삭제하는 이유는 무엇입니까?

  29. 29

    PC를 종료 할 때 마우스의 LED가 꺼지지 않는 이유는 무엇입니까?

뜨겁다태그

보관