https://www.acmicpc.net/problem/4949
이 문제 처럼 여러줄의 문장을 입력으로 받는 경우를 생각해보자.
나이브하게 생각하면 아래처럼 하면 될 것 같지만..
1 2 3 4 5 | char line[100]; while(1){ scanf("%s", line); if(strcmp(line, ".")==0) break; } | cs |
막상해보면 공백이나 줄바꿈 단위로 끊어져서 단어 단위로 들어옴을 알 수 있다. (더군다나 공백이나 줄바꿈 정보는 소실된다)
만약 원하는게 단어단위로 끊어서 처리하는거라면 이렇게 처리해도 상관은 없다.
하지만 이 문제의 경우처럼 줄바꿈 정보가 필요한 경우는 다른 방법이 필요하다.
1 2 3 4 5 6 | char line[100]; while(1){ gets(line); if(strcmp(line, ".")==0) break; } | 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 |