티스토리 뷰

알고리즘

[c/c++] 문자열 입력 받기

심재철 2017. 8. 27. 19:40

[c/C++] 문자열 입력 cin() getline() 버퍼오버플로우 


문자열을 입력받을 , cin >>   보통 사용한다.


하지만 cin 으로 문자열을 입력받을 문제점들이 있다.


(1) 버퍼 오버플로우


cin으로 입력받는 배열의 크기를 넘어서는 문자열을 cin 통해 입력받으면, 배열의 크기를 넘어  다른 변수 소유의 메모리에 덮어쓰게 된다.


(2) cin은 공백과 개행문자를 입력받지 못한다.


cin 연속으로 사용하여 2번의 문자열을 받을 공백을 만나면 다음 cin 변수로 데이터가 넘어간다.

예를들어, I'm Hyeon 입력하면,  I'm 첫번째 변수에 Hyeon 두번째 변수에 들어간다.

공백처리를 하지 못하게 된다.


이러한 문제를 해결하기 위하여, 문자열을 입력받을 getline() 함수를 사용한다.


(1) 배열에 문자열 입력


char cs[20];

cin.getline(cs, 20);


위와 같이 사용하면 입력받은 문자열이 cs 배열에 대입된다. 

여기서 20개 이상의 문자열을 입력받으면, 20까지만 입력받게되고, 공백또한 포함하여 입력받는다.


(2) string에 문자열 입력


string cpps;

getline(cin, cpps);


cin 명령어로 받은 문자열을 cpps string 변수에 담는다.

문자열 크기의 제한은 없다.

공백또한 포함하여 입력받는다.


중요!!

1.cin 은 처음 입력된 white space를 무시한다 (엔터,탭,띄어쓰기)

2.cin 은 개행문자를 저장하지 않는다 ('\n')

3.getline(cin,string 변수); 는 개행문자와 공백을 모두 저장 한다 ('\n')


예제


string a;

while(1)

{

cin>>a;

}


이런  프로그램이 있을때 처음 문자열을 입력받아서 스트링 a에 저장한다. 

그런데 cin은 입력을 받을때 '\n'는 입력 받지 않기 때문에 입력 버퍼에 '\n'이 그대로 남아있다.


그다음 반복문에서 입력을 받기 시작하면 '\n'부터 입력을 받기 시작하는데,

 cin은 처음 입력된 '\n'을 무시하기 때문에 정상적으로 계속해서 문자열 입력을 받을수 있다.



cin.get()


문자 하나를 입력받는데, 공백문자도 하나의 문자로 취급한다. 즉 엔터키와 띄어쓰기도 하나의 문자로써 취급을 한다는것이다.

int a = cin.get(); 에서 입력한 문자가 'b' 일 경우 문자 b에 대한 아스키 코드값이 a에 저장되게 된다.(입력을 character형으로 받기 때문에)



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함