2010-01-11 3 views
2

지정된 시간 동안 공백을 허용하는 문자열 변수에 사용자의 입력을 수집하려고합니다. 보통 cin >> str 이후 std :: getline이 for 루프 내에서 작동하지 않습니다.

는 공백을 허용하지 않는, 그래서 < 문자열 여기 >

에서 표준 :의 getline 함께 가고 싶어 내 코드입니다 :

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    int n; 
    cin >> n; 
    for(int i = 0; i < n; i++) 
    { 
     string local; 
     getline(cin, local); // This simply does not work. Just skipped without a reason. 
     //............................ 
    } 

    //............................ 
    return 0; 
} 

어떤 생각이?

+6

아무 이유없이 일이 거의 실패하지 않습니다. – GManNickG

+0

for-loop 앞에 다음을 시도하십시오. std :: cout << "n :"<< n << std :: endl; –

+0

예. n을 올바르게 읽었습니다. n에 2를 입력하면 "n : 2"가 인쇄됩니다. –

답변

10

이 실패한 이유를 알 수 있습니다 (그런데 가난한 변수 이름, 인 : P) : local에 저장 무엇을 출력하는 경우

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    int n; 
    cin >> n; 
    for(int i = 0; i < n; i++) 
    { 
     string local; 
     getline(cin, local); 
     std::cout << "> " << local << std::endl; 
    } 

    //............................ 
    return 0; 
} 

당신은 볼 것이다 그것이 인쇄가 전화 번호를 입력 한 직후에 > 뒤에 줄 바꿈을하십시오. 그런 다음 나머지 부분을 입력하는 단계로 이동합니다.

getline은 숫자 입력시 남은 빈 줄을 제공하기 때문입니다. (당신은 빈 줄 왼쪽하고 그래서는 \n을 제거하지 않습니다 분명히 수를 읽지 만.) 먼저 남아있는 공백을 제거해야합니다

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    int n; 
    cin >> n; 
    cin >> ws; // stream out any whitespace 
    for(int i = 0; i < n; i++) 
    { 
     string local; 
     getline(cin, local); 
     std::cout << "> " << local << std::endl; 
    } 

    //............................ 
    return 0; 
} 

이 작품을 예상대로. 주제 끄기

은 아마 손에서 미리보기 만했다,하지만 당신은 using namespace std;이없는 경우 코드는더 읽기 경향이있다. 그것은 네임 스페이스의 목적을 이깁니다. 나는 그것이 단지 여기에 게시하는 것으로 의심합니다.

+3

나는 std :: namespace 접두어를 명시 적으로 사용하는 경향이 있지만 cpp (h가 아님) 파일에 using 선언을 사용하는 데는 아무런 문제가 없습니다. –

+1

아마 이런 간단한 예에서. 하지만 네임 스페이스'std'에는 * 많은 것들이 있습니다. 함수 수준은'using' 지시어로 할 수있는 가장 전역입니다. – GManNickG

1

들어가 시나요? 라인을 얻지 못하면 라인의 끝을 기다리고 있기 때문에 아무 것도 반환하지 않을 것입니다 ...

0
  • 입력에서 n을 적절하게 초기화합니까?
  • getline으로 아무 것도하지 않는 것 같습니다. 이게 니가 원하는거야?
  • getline은 istream 참조를 반환합니다. 당신이 땅에 떨어 뜨리고 있다는 사실이 중요합니까?
+0

예. 인쇄를 시도하고'n'이 제대로 초기화되었습니다. --- getline 후에 코드를 자릅니다. –

1

내 생각에 n을 올바르게 읽지 않아서 0으로 변환됩니다. 0은 0보다 작지 않으므로 루프가 실행되지 않습니다.

int n; 
cin >> n; 
std::cerr << "n was read as: " << n << "\n"; // <- added instrumentation 
for // ... 
+0

번호 루프가 실행됩니다. 저는 VC++ 2008을 사용하고 있습니다. 따라서 코드를 한 줄씩 추적하여 디버깅 할 수 있습니다. –

0

하는 컴파일러에 당신이 시도 않았다

나는 계측의 비트를 추가하는 것? 나는 VC2008에 노력하고 잘 일했다. g ++ (GCC) 3.4.2에서 동일한 코드를 컴파일하면. 제대로 작동하지 않았습니다. 아래는 두 컴파일러에서 모두 작동하는 버전입니다. 나는 내 환경에 최신 g ++ 컴파일러가 없다.

int n; 
cin >> n; 
string local; 
getline(cin, local); // don't need this on VC2008. But need it on g++ 3.4.2. 
for (int i = 0; i < n; i++) 
{ 
    getline(cin, local); 
    cout << local; 
} 
0

중요한 질문은 "입력을 건너 뛰었다는 아이디어를주는 문자열로 무엇을하고 있습니까?"입니다. 또는 정확하게 말하면 "왜 입력을 건너 뛰었 을까?"

디버거를 단계별로 실행하는 경우 최적화 명령을 사용하여 컴파일 했습니까?나는 이것이 당신의 문제라고 생각하지 않지만, 그것은 가능성이 있습니다.

문자열이 채워졌지만 올바르게 처리되지 않았을 가능성이 높습니다. 예를 들어 입력을 이전 C 함수 (예 : atoi())에 전달하려면 C 스타일 문자열 (local.c_str())의 압축을 풀어야합니다.

1

문자를 으로 신고하십시오. 번호를 입력 한 후 반송으로 돌아갑니다. char ws;int n;cin>>n;ws=cin.get(); 이렇게하면 문제가 해결됩니다.

단지 '\n'을 삭제하는 대신, 당신의 문자열의 첫 번째 문자가 변수 ws에있을 것, 대신 ws=cin.get()cin>>ws 사용. (

#include <iostream> 
using namespace std; 
int main() 
{ 
    string str; 
    getline(cin,str,'#'); 
    getline(cin,str,'#'); 
} 

당신이 입력 str을 여러 번 당신이 원하는 수 있지만, 하나의 조건은 여기에 적용하면 '#'을 통과 할 필요가있다 :

0

직접 다음과 같이 구분 기호를 사용하여 문자열의 getline 기능을 사용할 수 있습니다 세 번째 인수)를 구분 문자로 사용합니다. 즉, 줄 바꿈 문자에 관계없이 '#'을 누를 때까지 문자열이 입력을받습니다.

관련 문제