변수 c
의 첫 번째 반복 값 끝에 EOF가 발생하고 모든 다음 반복에서 루프 조건에 대해 c != EOF
으로 인해 루프가 끊어져서 문자를 인쇄 할 수 없다는 버그가 있습니다. 실제로 코드에서 정의되지 않은 동작을 일으키는 원인이되는 초기화되지 않은 c
을 사용하여 @alk 고지와 comment을 질문합니다.
각 for 루프가 시작될 때 c
을 (다시) 초기화해야합니다.
교체 :
for(;c!=EOF;c= getc(fp),putchar(c));
기준 :
for(c = getc(fp); c != EOF; putchar(c), c= getc(fp));
// ^^ always initialize ^^ ^^ swap order
를 또한 다음 더 나은 방법이다 void rewind (FILE * stream);
기능을 사용하기 위해 또 다시 파일을 읽으려면, 당신은 파일을 되감기 할 필요가 루프가 끝날 때 파일의 시작 부분에 대한 포인터 :
fp = fopen("hello.txt", "r");
for(i = 0; i < 10; ++i) {
for(c = getc(fp); c != EOF; c = getc(fp), putchar(c));
rewind(fp);
}
fclose(fp);
참고 : ;
및 ,
뒤에 코드를 읽을 수있는 공간을 만드십시오.
코드에서
c
는 EOF 루프가 영원히 무시됩니다 될 때 같이
좋은 방법은 오류를 찾기 위해 프로그램을 디버깅하는 것입니다. –
'c'는'EOF'에 대한 테스트이기 때문에 초기에 루프를 입력 할 때 코드는 이미 정의되지 않은 동작을합니다. 초기화되지 않은 변수를 읽으면 정의되지 않은 동작이 발생합니다. – alk