cin의 처리부분 어떻게 해야할지... 도와주세요

kknd345의 이미지

프로그래밍 공부하는 학생입니다.
 
알고리즘도 아닌 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');
     }
   

    // 이부분에 어떻게 추천후보번호를 받아야 할지 모르겠어요 //

   }
} 
 
  

SunnyPhysics6의 이미지

cin >> inputcnt;
cin.get(); // 이 부분이 엔터를 받아서 먹습니다.

winner의 이미지

국내대회는 입력이 정말 편했었는데 다른 나라대회의 경우는 그렇지 않은 경우도 있었죠.

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 의 상태정보를 초기화하고 다시 입력을 받기 위해서 사용되는 것입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.