injoon2018   5년 전

9퍼에서 끊기네요

왜 오류가 나는 것일까요?? 

파일 입력의 개행 구분을 '\n'으로 하나요?

djm03178   5년 전

cin >> number는 공백과 개행을 구분하지 않고 그대로 무시해버리기 때문에 이 방법으로는 줄을 구분할 수 없습니다.

한 줄을 통째로 입력받은 뒤 토큰을 분리하거나, cin.get으로 개행이 들어오는지 체크해보세요.

injoon2018   5년 전

이해가 잘 안가는데요 ㅠ 토큰은 뭐고 cin.get은 어떻게 쓸 수 있는건가요?

number에 ' ' 또는 '\n'이 들어오면 break가 되게 하였는데 이걸로는 왜 안되나요?

jh05013   5년 전

"cin >> number는 공백과 개행을 구분하지 않고 그대로 무시해버리기 때문에"

djm03178   5년 전

토큰이라는 건 쉽게 말해서 전체 문자열에서 내게 필요한 부분 문자열을 어떤 규칙에 의해 끊어낸 것을 말합니다. 여기서 전체 문자열이라는 건 숫자 뿐 아니라 공백, 개행 문자까지 모두 들어있는 상태의 문자열을 말하는 것이고, 토큰을 분리한다고 하면 필요 없는 공백이나 개행 같은 지우고 숫자들만 모아서 각각의 수를 읽어들이는 걸 말합니다. cin >> number는 자동적으로 그런 역할을 하는데, 말 그대로 공백이나 개행 같은 건 그대로 무시해버리기 때문에 number에 절대로 저장되지 않습니다.

injoon2018   5년 전

사용자가 엔터를 입력하면 '\n'이 입력되는 것 맞나요??

아래 코드는 왜 안되는 것일까요? cin이 개행을 무시한다하여 getline을 써봤습니다. getline은 개행을 전부 다 포함한다길래...

그래서 데이터를 전부 받아서 \n이 나오기 이전까지의 숫자들을 합하여 더하는 방식을 써봤습니다


djm03178   5년 전

while (getline(cin, number)) 이렇게 하면 하나의 테스트케이스에 해당하는 한 줄을 읽는 게 아니라 입력 파일의 끝까지 읽어버립니다. 반복문을 돌릴 이유가 하나도 없어요. 이름이 getline인 이유는 한 줄을 통째로 받으니까 getline입니다.

그리고 getline도 끝에 개행 문자는 안 넣어줍니다. 다만 문자열의 끝이 그 줄의 끝이라는 건 알 수 있습니다.

djm03178   5년 전

반복문은 getline으로 읽은 한 줄에 대해서 인덱스만 돌려가면서 검사해야지, 입력 자체를 반복문으로 받으면 안 됩니다.

injoon2018   5년 전

아 그렇군요. 검색해보니 cin.get()은 char 하나를 받을 수 있다는데 그럼 숫자가 두자리가 넘어가는 경우는 어떻게 처리를 해야할까요? 

djm03178   5년 전

cin.get() 말고 getline() 그대로 하면 됩니다. 공백이 나오면 substr로 잘라서 stoi 해도 되고, 10배 하고 한 글자씩 더하고 해도 됩니다.

injoon2018   5년 전

입력의 각 줄이 '\n'으로 구분되는 것 맞나요?? 지금 이 코드를 돌리니 무한루프에 빠지더라고요. F10으로 하나씩 따라가봤더니 if (number[i] == '\n' ) 이 줄을 들리지를 않네요 ㅠ

djm03178   5년 전

말씀드렸다시피 getline은 개행 문자를 넣어주지 않습니다. 개행 문자가 나타날 때까지 읽고, 그 문자는 버린 뒤 리턴합니다. 문자열의 끝이 그 줄의 끝입니다.

injoon2018   5년 전

으아 이게 눈에 보이는 것이 아니다보니 개념 정립이 어렵네요;; 개행 문자로 구분 할 수 없어서, 문자열의 길이만큼 반복을해서 숫자를 더하게 했습니다. vs와 ideone에는 잘 돌아가는데 정답은 아니네요

djm03178   5년 전

수는 한 글자가 아닐 수도 있으니까 틀리는 게 당연합니다. substr 같은 걸로 구분해서 자르라고 말씀드렸습니다.

djm03178   5년 전

그리고 while (i < number.length()) 로 충분합니다.

jaehoo1   5년 전

저는 if(getchar()=='\n')을 써서 라인입력을 받았어요

djm03178   5년 전

^ 이것이 제가 맨 처음에 알려드린 "cin.get으로 개행이 들어오는지 체크해보세요."입니다.

injoon2018   5년 전

djm03178  //죄송합니다 그냥 머리가 멍하네요 뭘 어떤 기준을 잡아서 substr으로 잘라야할지도 모르겠고;;

injoon2018   5년 전

jaehoo1  //감사합니다 c++ 배운후로 cin과 cout에 썼더니 scanf는 안쓰게 되었는데, 성능면에서는 scanf가 더 좋은 것 같더라고요 더 많은 분들이 쓰는 느낌..

djm03178   5년 전

0번째 부터 쭉 보다가 i번째에 공백이 나왔습니다. 그러면 0 ~ i-1가 하나의 수인 거겠죠. 이걸 substr로 자릅니다.

이제 j = i + 1이라고 놓고, 다시 i를 계속 증가시켜가다가 또 공백이 나왔습니다. 그러면 j ~ i - 1이 또 하나의 수겠죠? 여기를 또 substr로 자릅니다.

이걸 반복해서 문자열의 끝까지 봐주면 됩니다.

injoon2018   5년 전

djm03178  //감사합니다 substr은 첨봤네요.. 혹시 죄송하지만 cin.get()으로 어떻게 코드 짤 수 있는지 보여주실 수 있나요..? 다른 분들 코드는 다 scanf 를 이용했네요

djm03178   5년 전

위에 jaehoo1 님이 올려주신 코드에서 scanf를 cin >> 으로, getchar를 cin.get으로 바꾸면 됩니다.

injoon2018   5년 전

djm03178// 감사합니다!!

댓글을 작성하려면 로그인해야 합니다.