: 다음 함수로 문자열을 받아서 길이를 구합니다
:
: int getline( char <>, int lim ) /* lim : max length */
: {
: int c, i;
:
: for(i=0; i<lim-1 && (c=getchar())!=EOF && c!=''; i++)
: s[i] = c;
: if (c == '') {
: s[i] = c;
: i++;
: }
: s[i] = ' ';
: return i;
: }
:
: 코드의 for 문에서 lim 가 만약 10이라면 문자를 8개만 읽
게
: 되는 것 아닌가요? 그리고 다음 if 문에서 을 받아서 넣고
: 마지막 s[9]에다가 을 넣
는 건가요? <= 이렇게 이해했음
:
: 그렇다면 중간에 if문이 구지 필요가 없을 것 같은데요
: 그리고 만약 문자열 끝에 이 포함되어 있지 않다면 9개가 아닌
: 8개밖에 구할 수 없을 것
: 같은데요..
: 다르게 테스트 해보니 생각하는 것이랑 틀리게 되네요..
: 설명좀 부탁드립니다
:
: --
: 비나 왔으면 좋겠다
쓰여져 있는 코드는 콘솔상에서 한 라인을 입력받는 함수입니다.
buffer overflow 를 방지하기 위해서 최대 입력받을수 있는 길이가
아규먼트로 전달되고, 첫번째 아규먼트에 입력받은 라인을 넣습니다.
두번째 아규먼트에 대해서 정확히 해야 할 점이 잇는데..
최대 입력받는 길이가 아닌, 첫번째 아규먼트의 크기를 의미하는거
같습니다.
예로 드신 lim == 10 인 경우에는..(첫 아규먼트가 s 인거 같군요..)
첫번째 아규먼트 크기가 10이라는 의미라고 생각하고 분석해 보시면
s 는 0 ~ 9 까지의 인덱스를 가지며..
첫번째 for 문에서는 '' 문자나 입력의 끝, 혹은 i 가 9 미만일때까지
문자를 읽어서 배열에 넣습니다.
그리고 그 다음 if 문에서 문자가 입력되었으면 '' 문자도 넣습니다.
그리고 마지막 부분에서 ' ' 문자를 넣어서 문자열의 끝을 확실히 하죠.
한번 예를 들어보죠...
1) long_enough_to_over_10_char
2) short
3) a<Ctrl+D> <- <Ctrl+D> 는 Ctrl+D 를 눌렀다는 의미입니다.
1) 번의 경우에서는 long_enou 까지 배열에 들어가고 ' ' 문자가
맨 마지막에 추가된 다음 함수가 끝납니다.
2) 에서는 short 를 배열에 넣고, if 문에 의해서 '' 까지 배열에
들어간 다음 ' ' 문자 추가.
3) 에서는 a 가 들어가고, 그다음 ' ' 문자.
-> ' ' 을 의미, _ -> '' 을 의미
0 1 2 3 4 5 6 7 8 9
1) l o n g _ e n o u
2) s h o r t _
3) a
이렇게 되는 것입니다.