본문 바로가기

개발

C 언어 - 자주 사용하는 함수 read_line

 엔터 단위로 한 줄씩 문자열을 받아 와서 뭔가 작업을 해 주고 싶다. 일단 scanf는 불가하다(엔터 단위이므로). 그럴 때 쓰려고 만든 함수이다.

1
2
3
4
5
6
7
8
9
int read_line(char * buffer, int n) {
    int i = 0;
    char c;
    while ((c = getchar()) != '\n')
        if (i < n - 1)
            buffer[i++= c;
    buffer[i] = '\0';
    return i;
}

cs


 이거다. gets나 fgets를 써도 되지만 그렇게 하면 계속 버퍼에 잔여 문자들이 존재하게 되는 문제점이 있다. 그리고 인풋으로 들어가는 매개 값들도 매번 기억하기 귀찮다. 그래서 이렇게 만들어 놓고 쓰는 경우가 많다고 한다. 나도 그래야겠다 ㅎㅎㅎ


1
2
3
4
5
6
7
8
9
int read_line(char buffer[], int n) {
    int i = 0;
    char c;
    while ((c = getchar()) != '\n')
        if (i < n - 1)
            buffer[i++= c;
    buffer[i] = '\0';
    return i;
}
cs


업데이트!! 매개변수의 형식을 바꿔 주었다. 문자열을 입력으로 받는데 무슨 차이지? 라고 생각할 수도 있지만 이는 리터럴과 문자열의 차이와도 같으므로 혹시 모를 경우를 대비한 것이라고 할 수 있다. 


1
2
3
4
5
6
7
8
int read_line(FILE *fp, char str[], int n) {
    int ch, i = 0;
    while ((ch = fgetc(fp)) != '\n' && ch != EOF)
        if (i < n - 1)
            str[i++= ch;
    str[i] = '\0';
    return i;
}
cs


 다시 업데이트 이번 버전은 파일 스트림에 대해서 모두 사용할 수 있다. 예를 들어서 키보드 입력을 받고 싶으면

read_line(stdin, buffer, buffer_size)이렇게 해 주면 된다.