문자를 입력받을 때 흔히, scanf나 fgets 를 사용한다...

2가지 이외에도 gets() 라는 함수인데,

이 함수는 치명적인 문제가 있다..

버퍼 오버플로우를 검사하지 않기 때문에, 10의 공간을 할당하고 나서,

12의 값을 넣어도 ( 메모리의 크기 ) 일단은 들어간다..

하지만 나중에 큰 문제를 일으킬 소지가 있다...

그리하여, scanf와 fgets를 사용한다고 치면,

scanf는 숫자, fgets는 문자열을 입력받는 것으로 사용하는 것이 좋다.....

scanf의 가장 큰 단점은 띄어쓰기를 인식 못한다는 점이다...

예를들어.. 이름을 입력하고자

char name[20] ;
scanf("%s", name ) ;

이렇게 입력하고 콘솔창에 test test test ; 이렇게 입력한다면...

출력 결과는..

test 만 나온다...

만약 다 입력 받고 싶으면,

scanf("%s%s%s", name1, name2, name3 ) ;

이런식으로 입력하면 되긴하지만.. 원하는 동작은 아니다...

그리하여 scanf가 편리하긴 하지만.. 숫자를 입력받을 때 정도만 쓰는 것이 좋다...

문자열을 입력받을 때는 fgets를 사용하려면,

fgets(name, 10, stdin ) ;

이런식으로 사용하면된다.. 가운데의 10은 버퍼의 크기이기때문에 자유롭게..

변경하면된다...

하지만 fgets도 문제가 있는데.. fgets는 자동적으로 개행문자가 삽입된다..

개행문자는,, printf같은 것을 사용할 때 다음줄로 넘어가는 \n 이다..

그렇기 때문에..

출력시에는 문제없이 출력된 것 처럼 보이나, 문자열의 크기를 비교한다던지

하면 문제가 발생할 수 있다..

그러니 꼭, 입력된 문자의 길이를 검사하여서, 개행문자를 없애고 그 자리에

/0(NULL) 을 넣어주면된다..

이 것을 코드로 표현하면..

name[strlen(name) - 1 ] = '\0' ;

처럼 넣어줘도 된다...

(단, name의 크기가 유동적이면 힘들고, 딱 배열의 크기에 맞게 설정되었을 때에 쓸 수 있다.. )

'프로그래밍 > C,C++' 카테고리의 다른 글

[C,C++] 가변 인자란 ...  (0) 2011.08.28
[C,C++] getchar() 의 문제점..  (2) 2011.08.28
[C,C++] sprintf 사용하기...  (2) 2011.08.23
[C,C++] 문자열에 대하여...  (0) 2011.08.23
[C,C++] 배열의 초기화..  (0) 2011.08.22
Posted by 바람처럼..
|