이 잘못 : 여기에 코드입니다.
당신이 문서에서 볼 수 있듯이, 첫 번째 인수가 (해야한다 무엇을)를 배열 문자의, 두 번째 인수 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')
cin.ignore 15 chars –
cin.clear(); cin.ignore (100, '\ n'); – DeathbeByUs
미안하지만 내가 왜 포함시키지 않는지 묻는 이유는 무엇일까? – DeathbeByUs