2011-11-23 4 views
11

이것은 처음 stackoverflow를 사용하는 것입니다. getline과 관련하여 필요한 정보를 찾을 수 없었습니다. 엔지니어링 전송을위한 간단한 프로그래밍 수업을 진행하고 있으므로 우리가 작성하는 코드는 매우 간단합니다. 내가 여기서하려고하는 것은 사용자가 정의한 수의 질문과 답변을 두 개의 다른 배열에 넣는 것입니다. 나는 일부를 입력 대답뿐만 아니라 파일의 저장 데이터를 기록getline + 문자열에 대해 이해할 수없는 점은 무엇입니까?

int main() 
{ 
    srand((unsigned)time(0)); 
    string quest1[100], answ1[100]; 
    int size1, x = 0, num, count1, visit[100], shuffle[100]; 
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl; 
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl; 
    cout << "\nHow many flash cards will be entered(MAX 100)? "; 
    cin >> size1; 
    cout << endl; 

    while(x < size1) 
    { 
     cout << "Enter Question: "; 
     getline(cin , quest1[x]); 
     cout << endl; 
     x = x++; 

     /* 
     cout << "Enter Answer: " << endl; 
     getline(cin,answ1[x]); 
     cout << endl; 
     flashcard1.open("flashcard1.dat", ios::app); 
     flashcard1 << quest1[x] << " " << answ1[x] << endl; 
     flashcard1.close(); 
     cout << "Data Stored." << endl; 
     */ 
    } 
} 

: 내 while 루프 (나는 그것을 깨는 중지 할 경우 단지보기 위해 루프를 사용하지만, 동안으로 전환되었다)과 같다 디버깅 용입니다. 프로그램을 실행하면 첫 번째 질문에 대한 getline을 건너 뛰고 "Enter 질문"의 두 번째 루프를 표시하고 나머지는 getline이 작동합니다. 따라서 size1이 5 인 경우 프로그램은 배열 위치 1-4 만 채 웁니다. 도와주세요. 이것은 공부하고 셔플하기 위해 플래시 카드를 만드는 것과 같은 일을하는 간단한 플래시 카드 프로그램입니다. 당신이

cin >> size1; 

을 할 때 번호를 입력하고 Enter 키를 누르 때문에

+7

'x = x ++;'는 정의되지 않은 동작입니다. 'x ++ '(또는'++ x' 또는'x + = 1' 또는'x = x + 1' 또는'x - = -1' ....)이어야합니다. –

+0

이것은 x ++와 ++ x는 둘 다 값을 1 씩 in/decrement하여 x 자체를 변경합니다. 할당이 이전이나 이후에 발생한다고 보장 할 수 없으므로 x가 증가하기 전에 x ++에 값을 할당 할 수 있습니다. 표준은 이것만을 지정하지 않는다). –

+4

좋은 첫 번째 질문에 대한 +1. –

답변

12

는 첫 번째 반복을 건너 뛸 나타나는 것 이유입니다. cin의 정수를 읽고 버퍼에이라는 개행 문자를 읽지 않은 상태로 두어 getline을 호출하면 마치 바로 Enter 키를 누를 때와 마찬가지로 getline이 아무 것도 읽지 않습니다 (줄 바꿈 문자를 읽기 전에 중지되기 때문에). newline을 입력하고 빈 문자열을 quest1[0]에 넣습니다. 그리고 이것이 나머지 getline이 "올바르게"작동하는 이유입니다.

'\n'을 없애기 위해 루프 위에 cin.ignore('\n')을 추가하면 코드의 다른 오류가 발생하지 않도록 작동해야합니다.

UB를 피하기 위해 x = x++x++으로 변경하는 것을 잊지 마십시오.

+0

고마워요! 나는 수년에 걸쳐 그런 도움이되는 지역 사회를 경험하지 않았다! – Brent

+0

@Brent 이것이 귀하의 질문에 대한 답변이라면, 옆에있는 체크 표시를 클릭하여 귀하의 질문에 대한 대답으로 표시하십시오. –

+0

사과드립니다.나는 이전에 학급에 있었고 내 프로그램을 편집 할 수 없었지만 이것이 올바른 대답이라고 생각했습니다. 내 루프 위의 cin.ignore ('n)에 추가했을 때, 프로그램은 단지 루프 내에서 첫 번째 cout 문을 가져 오지 않습니다. 반올림을하지 않으면 1234 번 입력하십시오. – Brent

관련 문제