2012-10-21 2 views
2

GNU getline()을 감싸고 후행 줄 바꿈을 제거하는 함수를 작성했지만 어떤 이유로 그것이 효과가 없습니다. 내가 뭔가 잘못하고 있는거야?개행을 제거하는 함수는 효과가 없습니까?

ssize_t readline(char **lineptr, FILE *stream) 
{ 
    size_t len = 0; // Size of the buffer, ignored. 

    ssize_t chars = getline(lineptr, &len, stream); 

    if((*lineptr)[chars] == '\n') { 
    (*lineptr)[chars] = '\0'; 
    --chars; 
    } 

    return chars; 
} 

문제없이 컴파일하고 링크하지만 뉴 라인은 널 종결 자로 대체되지 않습니다. if() 문이 실행 중인지 확인했습니다. 어떤 도움을 주셔서 감사합니다!

+0

줄 바꿈을 제거하기 위해 이것을 사용했습니다. g_strchomp (line) – TechZilla

답변

9

getline 문자를 읽을 수를 반환합니다. 따라서 char 대신 chars-1을 사용해야합니다.

if ((*lineptr)[chars - 1] == '\n') 
    { 
     (*lineptr)[chars - 1] = '\0'; 
     --chars; 
    } 

남자의 getline (3) 널 종료 바이트를 포함 성공

, getline()과> 구분 기호 문자를 포함, 문자의 수 읽기 돌아 getdelim() 아니라 . 이 값은 읽은 행의 널 바이트를 처리하는 데 사용할 수 있습니다.

+0

그게 다야, 고마워! – James

4

이후에 이 아닌 마지막 문자를 확인하고 바꿔야합니다.

if ((*lineptr)[chars - 1] == '\n') { (*lineptr)[chars - 1] = '\0'; } 

(문자의 수 읽기 getline() 반환, 그냥 문자열의 strlen() 반환 길이로 는 종료 0 문자 제외.)

+0

훌륭하게 해결되었습니다! 어리석은 실수 야. – James

+0

@ 제임스 아무 문제 없습니다. upvote/accept (할 수있을 때). –

관련 문제