2017-09-17 9 views
-3

사용자로부터 문자열 묶음을 읽은 다음 줄 바꿈 문자를 읽고 스택에 읽은 모든 문자열을 푸시하려고하는 중입니다. 왜이 코드는 개행이 발생할 때까지 문자열을 올바르게 읽지 않습니까?

stack<string> st; 
string str; 
while(str != "\n") 
{ 
    cin >> str; 
    st.push(str); 
} 

그러나,이 무한 루프에 가서 내가 개행 문자를 읽을 때 멈추지 않는다 : 여기에 지금까지 무슨이다. 왜 이런 일이 일어나는 걸까요? 어떻게 수정해야합니까?

답변

1

기본적으로 문자열 추출 연산자 (>> 연산자)는 모든 공백을 건너 뜁니다. A B C을 입력하고 개행 문자를 입력 한 다음 D E F을 입력하면 스트림 추출 연산자를 사용하여 한 번에 하나씩 문자열을 읽으려고하면 "A", "B", "C", "D", " E ","F "는 공백이없고 개행 문자가 없습니다. 당신이 줄 바꿈을 명중 할 때까지 문자열의 무리를 읽으려면

, 당신은 그것을 토큰 화하는 std::istringstream를 사용 후, 한 줄의 텍스트를 읽을 std::getline 사용을 고려할 수 있습니다 참고로

#include <sstream> 

/* Read a full line from the user. */ 
std::string line; 
if (!getline(std::cin, line)) { 
    // Handle an error 
} 

/* Tokenize it. */ 
std::istringstream tokenizer(line); 
for (std::string token; tokenizer >> token;) { 
    // Do something with the string token 
} 

- 원래 코드에서 일반적으로 다음과 같은 루프가 있습니다.

string toRead; 
while (allIsGoodFor(toRead)) { 
    cin >> toRead; 
    // do something with toRead; 
} 

이 방법은 루프를 한 번에 너무 많이 계속 실행하기 때문에 일반적으로 작동하지 않습니다. 특히 조건을 false로 만드는 입력을 읽으면 루프는 지금까지 읽은 것을 계속 처리합니다. 그것은 같은 것을 할 아마 더 좋은 생각 :

while (cin >> toRead && allIsGoodFor(toRead)) { 
    do something with toRead; 
} 
+0

Downvoter 시도 : 여기에 내 로직 잘못인가? 이 대답을 개선하기 위해 내가 할 수있는 일이 있습니까? – templatetypedef

+0

이것은 단순히 입력 루프를 작성하는 방법이 아닙니다. –

+0

나는이 ans (+1을 주었다)가 마음에 들지만,'어떤 조건은 toRead에 대해서는 사실이 아니다. ' – Charles

-2

봅니다

stack<string> st; 
string str; 
while(str!="\n") 
{ 
cin>>str; 
if(str == "\n") 
{ 
break; 
} 
st.push(str); 
} 

을하고 그리고 그 작동되는지 확인합니다. 그리고하지 않을 경우, 다음

while ((str = cin.get()) != '\n') 

대신

while(str!="\n") 
+2

제대로 작동하지 않을 것이라고 생각합니다.'cin'이 공백을 건너 뛰므로 줄 바꿈을 읽지 않을 것입니다. – templatetypedef

+0

@templatetypedef가 정확합니다. – Charles