cin의 처리부분 어떻게 해야할지... 도와주세요
프로그래밍 공부하는 학생입니다.
알고리즘도 아닌 cin 의 처리에서 막히니 한숨만 ㅜㅜ;;;;
조언 부탁드립니다.
현재 문제가 되는 부분이 2가지가 있습니다.
문제1.
밑의 코드에서 보시다시피
cin >> candidateCnt; // 현재 문제가 되는부분
여기서 candidateCnt 에 숫자는 잘 들어가는데 붙어있는 개행문자 '\n'이 바로 다음 이름에 자동으로 들어가버립니다;
flush 처리를 하지 않아 그렇다고 해서 cin.clear() 했는데도... 똑같은 결과가 나옵니다.
어떻게 처리를 해야 하나요? 아님 다른 방법 없을까요? ( c에서 제공되는 함수말고 cin을 사용했으면 하는데... )
문제2.
1 2 3 // 사람들의 추천 후보 번호 //
2 1 3
사람들의 추천 후보 번호를 받고 나서 개행 문자 두개가 나오면 처리를 끝내고 다음입력 케이스로 넘어가야 하는데;
후보자수는 위에서 받으니
cin >> 해서 for해서 후보자수 만큼 돌리려고 하니
끝을 어떻게 내야 할지 모르겠습니다.
추천 후보 번호 없이 '\n' 나오면 끝내야 하는데 어떻게 해야할지 깜깜합니다;;
현재 입력 형식은
/*-- 입력 --*/
2 // 입력 케이스의 개수
3 // 후보자 수
John Doe
Jane Smith
Sirhan Sirhan
1 2 3 // 사람들의 추천 후보 번호 - 제한은 있으나 몇명일지 알수 없음; 아래 두개의 개행으로 끝을 암//
2 1 3
2 3 1
1 2 3
3 1 2
3
Doel King
John Smith
Sara
1 2 3
2 1 3
2 3 1
1 2 3
3 1 2
/*-- 입력 끝 --*/
#include
struct votePerson{
int intro;
int candidate[20];
};
votePerson realVotePerson[1000];
char candidateName[20][80];
int main()
{
int i;
int inputCnt;
int candidateCnt;
// 입력 케이스의 개수 //
cin >> inputCnt;
// 입력 케이스만큼 반복 //
for( i=0; i < inputCnt; i++ )
{
// 실질적인 알고리즘 //
cin >> candidateCnt; // 현재 문제가 되는부분
cin.clear();
for( i=0; i ◁ candidateCnt; i++ ) // for 문에 부등호를 쓰니 뒤에가 잘리네요;
{
cin.getline( candidateName[i], 80, '\n');
}
// 이부분에 어떻게 추천후보번호를 받아야 할지 모르겠어요 //
}
}
간단하게요....이럼 됩니다.
cin >> inputcnt;
cin.get(); // 이 부분이 엔터를 받아서 먹습니다.
왜일까요?... ICPC 가 떠오르는 것은...
국내대회는 입력이 정말 편했었는데 다른 나라대회의 경우는 그렇지 않은 경우도 있었죠.
Source 작성이 쉬워지도록 입력형식을 약각 수정하는 것이 좋을 거라고 생각합니다.
추천목록 앞에 목록 수를 정할 수 없다면 모든 추천목록이 끝난 후 끝났음을 알리는 표시문자를 두는 것이 어떨까요?
이 경우는 0 을 쓰는 것이 한 방법이고요.
형식을 유지하고 싶다면 줄 단위로 처리하는 것이 좋을 것입니다.
가장 괜찮은 방법이라고 생각되는 것은 sstream 을 쓰는 것인데 아무래도
거기까지는 공부가 되지는 않았을 것 같군요.
C 의 함수로는 sscanf 가 있는데....
개행문자가 후보자수 다음에 첫 후보자 이름으로 들어간다고 말씀하시는 것은
입력 예를 보니 성과 이름을 한꺼번에 처리하기 위하여 cin 에 입력연산자로 산술형을 받아들인 후
cin.getline 을 쓰실 때 당연히 발생하는 문제입니다.
왜인지 C++ 기초플러스로 공부하고 계신 듯한 느낌이...
이역시 문자열로 한 줄을 받아들인 다음에 산술값을 추출한 후 변환하던가 아니면
다음의 개행문자를 읽어내버리는 방식이 아닌한 cin.getline 은 남아있는 개행문자까지를
첫번째 후보자로 인식할 수 밖에 없죠.
읽어내버리는 방식으로 추천하는 방식은 ignore 를 사용하는 것인데 이것은 보통 입출력에 대해
다루는 chapter 에서 나오기에 반복 앞에 그냥 버리기 위한 cin.getline 을 한번 호출하는 것이
적절할 것이라고 생각합니다.
cin.getline(candidate[0], 80); // 아마도 한 줄은 80문자가 넘지않는다는 가정이 있는 거겠죠?.
정도가 적당하겠죠.
입력 stream 에 flush 는 없습니다.
clear 는 stream 의 상태정보를 초기화하기 위해 쓰입니다.
그러니까 산술형을 요구하는데 입력은 산술형이 아닌 문자정보가 들어가 있다든지,
이미 입력의 끝에 도달했다든지 할 때 잘못된 입력이 들어갔기 때문에 다음의 입력을 막기 위해 설정되는
cin 의 상태정보를 초기화하고 다시 입력을 받기 위해서 사용되는 것입니다.
댓글 달기