https://www.acmicpc.net/problem/4949

이 문제 처럼 여러줄의 문장을 입력으로 받는 경우를 생각해보자.


나이브하게 생각하면 아래처럼 하면 될 것 같지만..

1
2
3
4
5
    char line[100];
    while(1){
        scanf("%s", line);
        if(strcmp(line, ".")==0break;
    }
cs


막상해보면 공백이나 줄바꿈 단위로 끊어져서 단어 단위로 들어옴을 알 수 있다. (더군다나 공백이나 줄바꿈 정보는 소실된다)

만약 원하는게 단어단위로 끊어서 처리하는거라면 이렇게 처리해도 상관은 없다. 


하지만 이 문제의 경우처럼 줄바꿈 정보가 필요한 경우는 다른 방법이 필요하다.


1
2
3
4
5
6
    char line[100];
    while(1){
        gets(line);
        if(strcmp(line, ".")==0break;
    }
 
cs

그런경우 이런식으로 scanf 대신 gets를 쓰면 줄단위로 받는게 가능하다.

근데 황당하게도 C++14부터는 gets를 지원하지 않는다. ㄷ ㄷ ㄷ

따라서 이함수를 쓰려면 컴파일러를 C로 두거나 C++11이하로 두어야 한다.

또한가지 번거로움이 있는데 visual studio 2017에서는 gets를 지원하지 않아서 gets_s로 바꿔야 한다 ㅠ(근데 또 이대로 제출하면 안됨)


fgets(line, sizeof(line), stdin);  이거는 visual studio, gcc 둘다되는것 같다.


scanf("%[^\n]", str); 신기하게도 이것도 된다.
scanf("%99[^\n]", str); 좀더 safe하게 하려면 이렇게 100-1 숫자를 앞에 적어주면 된다. 1은 \n용


반응형

'Programming > Problem Solving' 카테고리의 다른 글

C++ bigint class  (0) 2020.03.30
백준 9663번 N-Queen  (0) 2020.03.15
행렬코딩  (0) 2020.03.01
백준 팁모음  (0) 2019.03.18
백준 제출시 오류유형 정리  (0) 2019.03.18

+ Recent posts