2010-04-24 3 views
1

친구, \ t로 구분 된 한 쌍의 문자를 읽고 싶습니다. 사용자가 어떤 문자에 대해서 z를 입력 할 때까지 입력을 계속 읽고 싶습니다. tC++로 구분 된 한 쌍의 문자 읽기

여기에 내가 생각했던 옵션은 다음과 같습니다

while (cin>>ch1>>ch2) 
{ 

// process ch1 & ch2 

} 

std::string str; 

while (getline(cin, str)){ 

//split string 

} 

은 또한, 나는 그것이 정확한지 확인하기 위해 입력의 유효성을 검사합니다. 가장 좋은 방법을 제안하십시오. 이것이 중복 된 것이라면, 저를 올바르게 지적하십시오.

감사합니다.

답변

3

이름에도 불구하고 std::getline()을 사용하면 줄 이외의 내용을 읽을 수 있습니다. 구분 기호를 나타내는 선택적인 세 번째 매개 변수가 필요합니다. 기본 설정은 '\n'이지만, 대신 '\t'을 사용할 수 없습니다.

std::string line; 
while(std::getline(is,line)) { // read lines 
    std::istringstream iss(line); 
    std::string field; 
    while(std::getline(iss,field,'\t') { // read fields from line 
    // process field 
    } 
} 
+0

3 문자열 콘솔 입력을 구문 분석하기 위해 2 개의 문자열과 추가 istringstream 개체를 만드는 것이 낭비가 아닙니까? :) –

+1

@ Kotti : 그럴지도 모르겠지만 ... 하나는'std :: getline()'을 사용하는 것이 확실히이 작업을 수행하는 가장 쉬운 방법입니다. 그리고 나서 - 왜 사용자 (또는 디스크)로부터 입력을 기다리는 코드 조각을 최적화하면 많은 차이를 만들지 못합니까? __If__이 코드가 느린 것으로 판명되면 (나는 매우 의심 스럽습니다), 나중에 최적화 된 코드로 대체 될 수 있습니다. 그때까지는 읽을 수 있고 버그가없는 코드 규칙이 있습니다. – sbi

+0

두 시간 동안'std :: getline()'에 대한 두 번째 호출이' '\ t '' 매개 변수를 놓쳤다는 사실을 아무도 알아 채지 못했습니다. – sbi

2

첫 번째 방법은 매우 좋고 C++입니다. 유일한 문제는 문자를 \t으로 분리 할뿐만 아니라 일반 공간 (예 : )으로 읽는 것입니다.

코드는 다음과 같은 방법을 보일 것이다

#include <iostream> 

void main() { 
    char c1, c2; 
    while (std::cin >> c1 >> c2) { 
     if (c1 == 'z' || c2 == 'z') break; 
     // Otherwise do something useful 
    } 
} 

대체 접근 방식은 입력에서 하나의 심볼을 화면에 보여 getche()을 사용하고 있습니다. 지금 당신이 순서를 입력 한 후 enter 키를 누를 필요가 없습니다

#include <iostream> 
#include <conio.h> 

void main() { 
    while (true) { 
     char c1 = getche(); 
     char delimiter = getche(); 
     char c2 = getche(); 

     // Output end of line 
     std::cout << std::endl; 

     if (delimiter != '\t' || c1 == 'z' || c2 == 'z') break; 
     // Otherwise do something useful 
    } 
} 

참고 : 여기에 코드입니다. 원하는 경우 getche() 호출을 하나 더 추가하고 char이 32 (입력 코드)와 같은지 확인할 수 있습니다.

+1

일반적으로는 두 번째 접근 방식도 괜찮지 만, 따라서 입력 시퀀스의 같은 종류의 권장하지 않습니다, 문자열을 구문 분석 및 추가 신체의 움직임을 필요로한다. –

+1

''이 표준 헤더라고 생각하지 않습니다. – sbi

+0

동의하지만 때로는 매우 유용합니다 (단순한 콘솔 파서 작성을 단순화하기 위해) –

1
int main(int argc, char* argv[]) 
{ 
    char c; 
    int count = 0; 
    string s; // s.reserve(LOTS); 
    while(cin) while(cin.get(c)) { // consume newlines as well 
     if(c == '\t') continue; 
     if(c == 'z') break; 
     ++count; 
     s += c; 
    } 
    cout << "got " << count << " tokens." << endl; 
    cout << s << endl; 
    return 0; 
} 
관련 문제