2015-01-31 3 views
1

안녕 얘들 아, 나는 포인터를 사용하지 않고 온라인 질문에서이 작업을하고있다. 내 코드가 실행되고 잘 준수합니다. 메신저 나는 무엇을 잘못하고 내 프로그램이 처음에는 제대로 작동하지 못하게 한 다음 두 번째로 제대로 실행되지 않습니다 ... 세 번째 등등. 조언주세요! 미리 감사드립니다!내 프로그램이 처음으로 값을 받아들이고 다음 실행시 첫 번째 cin.getline()을 건너 뛰는 이유는 무엇입니까?

UserEWord.W1=new char; 
... 
cin.getline(UserEWord.W1,'\n'); 

cin 유형 std::istream이다, 그래서 당신은 실제로 호출있는 방법은 std::istream::getline()입니다 :

void continueProg(char& cont) 
{ 
    cout << "Continue (Y/N)?: "; 
    cin >> cont; 
    if(cont=='y'||cont=='Y') 
    { 
     cont = 'Y'; 
    } 
    else if((cont=='n')||(cont=='N')) 
    { 
     cont = 'n'; 
    } 
    else 
    { 
     cout << "Please enter valid alaphelbet!\n"; 
     continueProg(cont); 
    } 
} 
+0

cin.ignore 15 chars –

+0

cin.clear(); cin.ignore (100, '\ n'); – DeathbeByUs

+0

미안하지만 내가 왜 포함시키지 않는지 묻는 이유는 무엇일까? – DeathbeByUs

답변

1

이 잘못 : 여기에 코드입니다.

당신이 문서에서 볼 수 있듯이, 첫 번째 인수가 (해야한다 무엇을)를 배열 문자의, 두 번째 인수 n는 당신이 방법을 허용하는 배열의 크기이어야에 대한 포인터해야합니다 쓰기 (종결 NUL 포함). 옵션의 3 번째의 인수는 char 구분 기호입니다. 생략하면, 줄 ​​바꿈 ('\n')이 기본값입니다.

단일 문자로 W1 (및 W2)을 할당 했으므로 버퍼에 문자 1 개만 사용할 수 있습니다. 당신은 getline()으로 전화를 걸어 '\n'n으로 전달했습니다.이 문자는 분명히 구분 기호로 사용됩니다. 그러나 최종 결과는 char 값 (10)이 너무 커서 버퍼의 크기로 간주됩니다. 비어 있지 않은 입력이 있으면 버퍼가 오버플로되어 정의되지 않은 동작이 발생합니다.

정확한 질문에 대한 대답은 여기에 두 번째 문제있다 : cont는 단지 하나의 문자이기 때문에 여기에

void continueProg(char& cont) 
{ 
    cout << "Continue (Y/N)?: "; 
    cin >> cont; 
    if(cont=='y'||cont=='Y') 

당신이 cont에 입력 한 문자에 스트리밍하고는. 그러나 사용자는 입력 할 때 보내지는 종결 라인 피드로 인해 적어도 한 문자 이상을 입력하게됩니다. 추가 읽지 않은 입력은 프로그램이 다시 cin에서 입력을 읽으려고 시도 할 때까지 시스템의 입력 버퍼에 남아있게됩니다. 이는 위에서 인용 한 getline() 호출에서 다시 발생합니다. 따라서 읽지 않은 입력은 읽지 않은 줄 바꿈까지 읽을 수있게되므로 첫 번째 단어 이후의 모든 프로그램 반복이 단어 1을 건너 뛰는 것처럼 보입니다.

위의 두 가지 문제를 모두 해결하려면 , std::string으로 직접 읽을 수있는 글로벌 std::getline() 함수를 사용하는 것이 좋습니다. 그러면 크기 제한없이 완전한 라인을 얻을 수 있습니다. 예를 들면 :

std::string input; 
std::getline(std::cin, input); 

편집 : 귀하의 코멘트에 대한 응답으로, 아니, 당신은 할 수 없습니다. std::string 형식은 C++ 표준 라이브러리에서 제공하는 컨테이너 클래스이며 언어의 네이티브 char/char* 형식과 완전히 다른 동물입니다.일반적으로 const char* 또는 char*을 전달할 수 있지만 항상 std::string 또는 const std::string& IN 인수가 있어야하며 conversion constructor이 호출되어 const char* 또는 char*을 (을)로 변환 할 수 있다고 언급해야합니다. a const std::string&하지만, OUT 인수가 아닌 IN 인수에만 적용됩니다. 여기에는 std::getline()이 아니며, std::string&이 아닌 값을 취합니다.) 또한 std::string, const 또는 not가있는 경우 다음을 수행 할 수 있습니다. 내용을 가리키는 const char*을 얻으려면 std::string::c_str() 메서드를 호출하십시오.

당신은 정말 이런 식으로 뭔가해야 할 첫 번째 문제 해결 후, char의 배열을 고수 할 경우

#define MAX 100 
... 
UserEWord.W1=new char [MAX]; // allocate an array of MAX chars 
... 
cin.getline(UserEWord.W1,MAX); 

을 그리고 당신은 이사야으로 cin.ignore();를 사용할 수있는 두 번째 문제를 해결하기를 추천 :

void continueProg(char& cont) 
{ 
    cout << "Continue (Y/N)?: "; 
    cin >> cont; 
    cin.ignore(numeric_limits<streamsize>::max(),'\n'); // requires #include <limits> 
    if(cont=='y'||cont=='Y') 
+0

No problem :) – bgoldst