2013-02-18 4 views
2

골프 구조에 대한 메시지가 표시 될 때 다음 코드를 실행하고 새 줄을 삽입하면 (Enter 키를 누름) 함수에 대한 두 번째 호출은 입력을 요청하지 않고 완료됩니다 나는 다시 진입했다.빈 줄이있는 cin.get() 문제

나는 cin.get(), cin.clear(), cin.ignore (...)를 읽었지만 아무 것도 도움이되지 않는다.

저는 여러 개의 .cpp 파일과 헤더와는 아무런 관련이 없지만 코드를 그대로 사용하고 있다고 확신합니다.

Visual Studio C++ 2010 - Express를 사용하고 있습니다.

미리 도움 주셔서 감사합니다.

헤더 파일 : golf.h

#ifndef GOLF_H 
#define GOLF_H 

const int Len = 40; 

struct golf{ 

    char fullname[Len]; 
    int handicap; 

}; 

int setgolf(golf & g); 
void showgolf(const golf & g); 

#endif 

golf.cpp

#include "stdafx.h" 
#include "golf.h" 
#include <iostream> 
#include <string> 


using namespace std; 

int setgolf(golf & g){ 

    cout << "Enter a name for the golf structure:" << endl; 
    if (cin.get(g.fullname,Len)) {  
     cin.get(); // deals with the '\n' incase the user inputs a valid string 
     return 1; 
    } 
    else{ 
     return 0; 
    } 

} 
void showgolf(const golf & g){ 

    cout << "this golf structure contains the following information:" << endl; 
    cout << "name:  " << g.fullname << endl ; 
    cout << "handicap: " << g.handicap << endl ; 

} 

주()

#include "stdafx.h" 
#include "golf.h" 
#include <iostream> 
#include <string> 


using namespace std; 

int main() 
{ 

    golf myGolf; 

    // check of int setgolf(golf & g); 
    int answ = setgolf(myGolf); //try to input empty string 
    showgolf(myGolf); 
    cout << "the number returned :" << answ << endl ; 

    answ = setgolf(myGolf); // normal string 
    showgolf(myGolf); 
    cout << "the number returned :" << answ << endl ; 

    return 0; 
} 
+3

자유롭게 기능하는 ['std :: getline()'] (http://en.cppreference.com/w/cpp/string/basic_string/getline)을 생각해보십시오. – WhozCraig

+0

나는 cin.get()이 Enter 키를 눌렀을 때 생성되는 개행 문자를 사용하지 않는다고 생각합니다. 그래서 당신이 다시 그것을 부를 때마다, 그것은 아무런 입력이없이 거기에서 소비됩니다. 빠른 답변을 원하면 cin.get()을 두 번 호출하여 단일 입력을 가져옵니다. – mostruash

+0

mostruash -> 이미 몇 번 시도해 보았습니다. 불운. WhozCraig -> cin.get()에 익숙해 지려고합니다. *** myGolf를 시작하는 것을 잊었습니다. myGolf = { "some-name", 6}; 그러나 그것은 여기에 관련이 없습니다 – Stasv

답변

1

당신은 단지 첫 번째 프롬프트에서 Enter 키를 누릅니다 때이 문제가 발생합니다. 입력 스트림은 오류 조건 플래그 인 eof로 표시됩니다 (이것이 0을 반환하는 이유입니다). 그러면 입력 스트림이 작동을 멈 춥니 다.

이전 C++, pre ISO 1998의 종류를 사용하고있는 것 같지만 필자는 그렇게 생각하지 않습니다. 당신이 당신의 접근 방식을 고수 할 경우, 다음을 수행하십시오 cin.getline() 쓰기 (필요 아무것도 돌아 오지) 후 : cin.clear(); cin.sync();를 다음과 같이

void setGolf(Golf &g) 
{ 
    cout << "Enter a name for the golf structure:" << endl; 
    getline(cin, g.fullname)); 

    cin.clear(); 
    cin.sync(); 
} 

지금 약 코드를 현대화. 우선, 표준 라이브러리의 클래스 string을 사용할 수 있습니다.이 클래스는 문자열 리터럴을 저장할 수 있으며 필요에 따라 커질 수도 있습니다. chars의 최대 값을 지정하지 않아도됩니다. 이 클래스를 포함하지만 사용하지 않는 헤더 string을 포함하므로 다소 혼란 스럽습니다. string을 사용하면 Golf 구조에서 발생할 수있는 잠재적 버퍼 오버플로를 자동으로 수정하는 등의 다른 이점도 있습니다. 그래서 나는 할 수 있도록 구조를 변경합니다 :

struct Golf{ 
    string fullname; 
    int handicap; 
}; 

지금 당신이 그것을 string의 전체 라인과 저장을 읽는 당신을 위해 모든 마법을하고 utility에, getline()를 사용할 수 있습니다. 당신은 이제 void에 반환 형식을 변경할 수 있습니다

#include <utility> 

//... 

void setGolf(Golf &g) 
{ 
    cout << "Enter a name for the golf structure:" << endl; 
    getline(cin, g.fullname)); 
} 

: 그래서 당신에게, 당신의 golf.cpp 파일을 변경할 수 있습니다. getline()을 사용하는 동안 어떤 종류의 오류도 발생할 가능성은 없습니다. 어쨌든 리터럴이 truefalsebool (부울 유형)을 내장 유형으로 반환 할 수 있다는 점을 고려하십시오.

난 당신이 간단한 스타일로, 지금 main()을 바꿀 수 있다는 확신 : 대신 구조체의 마지막

int main() 
{ 

    Golf myGolf; 

    setGolf(myGolf); 
    showGolf(myGolf); 

    setGolf(myGolf); 
    showGolf(myGolf); 

    return 0; 
} 

, 당신은 클래스의 정보를 캡슐화 고려할 수 있지만, 다른 전체입니다 발행물.

희망이 도움이됩니다.

+0

Baltasarq -> 위대한 팁에 감사드립니다! 그렇습니다 #include 은 재발입니다. 불행하게도이 특정 문제를 cin.get()으로 이해하고 싶습니다. 왜 위의 문제가 발생하는지 알 수 있습니까? 비주얼 스튜디오 2010을 새로 설치했습니다. 오래된 스타트 아트로 설치하면 이상하게 느껴질 것입니다. – Stasv

+0

이 문제는 첫 번째 프롬프트에서 Enter 키를 누를 때 발생합니다. 입력 스트림은 eof로 표시되고 오류 조건 플래그 (0을 반환하는 이유입니다). 그러면 입력 스트림이 작동을 멈 춥니 다. 당신의 접근 방식을 고수하고 싶다면, 다음을 수행하십시오 : cin.getline() 이후 (아무 것도 반환 할 필요가 없습니다) : cin.clear(); cin.sync(); – Baltasarq

+0

Baltasarq -> 고마워! 나는 cin.get()을 시도했다. 이전에 cin.clear(). 그러나 cin.sync(); 트릭을 했어! 나는 그것에 관해 약간을 읽을 것이다. 귀하의 답변을 정확하다고 표시하게되어 기꺼이 답변으로 귀하의 의견을 게시하십시오. – Stasv

관련 문제