2017-10-06 21 views
-3

enter image description here세그멘테이션 폴트 (코어 덤프)

enter image description here

이 print.c 인이

#include <stdio.h> 
int wc(FILE *pointer) 
{ 
    int a; 
    int character=0,word=0,line=0; 
    a = getc(pointer); 
    while (a != EOF) 
    { 
    character++; 
    if (a == ' ') 
     word++; 
    if (a == '\n') 
     line++; 
    a = getc(pointer); 
    } 

    printf("character: %4d, word: %4d, line: %4d \n", character,word,line); 
    return 0; 
} 

이 word.c이다 main.c에있다

gcc -c print.c 
gcc -c word.c 
gcc -c main.c 
gcc -o main main.o print.o word.o 
./main 
text.txt 
text.txt 
segmentation fault (core dumped) 

이것은 내가 사용한 컴파일 방법입니다.

하지만 왜 분할 결함이 있는지 알 수 없습니다 (코어 덤프).

도와주세요.

+1

모든 경고와 디버그 정보로 컴파일 :'gcc -Wall -Wextra -g'. 그런 다음 디버거'gdb'를 사용하십시오. fix-my-code 질문은 주제와 관련이 없습니다. 사용하고있는 모든 표준 함수 [fopen (3)] (http://man7.org/linux/man-pages/man3/fopen.3.html)와 많은 다른 함수들에 대해 읽어보십시오. 실패 할 수 있습니다. 그것 [여기] (https://stackoverflow.com/a/18193383/841108)을 좋아하지 않는다는 것을 시험하십시오 –

+1

그것의 심상 대신에 원본을 배치하는 것이 좋았을 것입니다. –

+2

두 파일을 중간에 닫지 않고 두 번 열어야합니다. –

답변

1

main()에서 반환 값이 NULL인지 확인하여 오류가 발생한 경우 fopen()이 성공했는지 확인해야합니다.이 경우 오류가 발생했습니다.

또한, 조건 argc>1main()에서 두 번째로 fopen()에 만족하지 경우에도 argv[1]을 사용하고 있습니다. argc2보다 작 으면 argv[1]이 표시되지 않습니다.

printfile()while 루프에서 break 문은 첫 번째 반복 자체에서 실행됩니다.

그래서 whileif 문으로 변경하고 break을 제거하면 동일한 효과가 나타납니다. wc()while 루프에서

,

if (a == ' ') 
    word++; 
if (a == '\n') 
    line++; 

a (공간) 인 경우 a\n 있는지 확인하기 위해

if (a == ' ') 
    word++; 
else if (a == '\n') 
    line++; 

필요 없음을 만들 수 있습니다.

편집 : 사용을 마친 후에 열어 본 모든 파일을 닫는 것을 잊지 마십시오.

+0

아직 영어와 C 프로그래밍에 열세입니다. 나는 당신의 코멘트를 많이 이해했지만 fclose()에 대해서 한 가지만 이해하지 못했다 ... 괜찮다면 fclose()를 어디에서 사용해야하는지 가르쳐 주시겠습니까? – Huitseize

+0

@Huitseize 파일 사용을 마자 마자. 파일이 여전히 필요하지만 다른 파일을 열어야하는 경우 _different_ 파일 포인터를 사용하여 엽니 다. –

+0

@Huitseize'main()'에서 두 번째'fopen()'을 제거하면'fclose()'를 사용하는 것이 적절 해 보입니다. –