stdin getline 래퍼

Nov 02 2020

줄 바꿈 문자를 제외하고 stdin에서 한 줄을 읽고 싶습니다. 함수를 작성했습니다.

/* read in a line from stdin, NULL on failure
 * does not include trailing newline
 */
char*
readStdinLine() {
        char* buffer;
        size_t bufsize = 32;
        size_t characters;

        buffer = (char *) malloc(bufsize * sizeof(char));
        if (buffer == NULL)
                return NULL;

        characters = getline(&buffer, &bufsize, stdin);
        buffer[--characters] = '\0';

        char* text = (char *) malloc(characters);
        for (int i = 0; i < characters + 1; i++) {
                text[i] = buffer[i];
        }

        free(buffer);

        return text;
}

이것은 불충분 해 보입니다. 본질적으로 두 번, getline에서 한 번, 후행 줄 바꿈을 제거하기 위해 한 번 읽고 있습니다. 그것은 가장 메모리 효율적인 알고리즘처럼 보이지 않으며, 가능하다면 복사하지 않고 개행 문자를 제거하고 싶습니다.

저는 C에 매우 익숙합니다 (C ++, Java 등을 사용했지만 객체가없는 시스템 언어는 사용하지 않았습니다). 그래서 제가 잘못한 모든 코드 스타일을 배우면 감사하겠습니다. 감사!

답변

7 MartinYork Nov 02 2020 at 01:17

이 함수는 다음과 같이 작성할 수 있습니다.

char* readStdinLine()
{
        char*  buffer  = NULL;
        size_t bufsize = 0;
        ssize_t characters = getline(&buffer, &bufsize, stdin);
        if (characters == -1) {
            free(buffer);
            buffer = NULL;
        }
        else if (buffer[characters-1] == '\n') {
            buffer[characters-1] = '\0';
        }
        return buffer;
}

getline()기능은 필요한 모든 것을 수행합니다. 오류를 확인하고 줄 바꾸기 문자를 제거하기 만하면됩니다.)