2010-02-17 2 views
1

ACM IPC의 문제 중 하나에 코드를 제출해야합니다. 아시다시피, 시간이 많이 걸립니다. 그래서 나는 다음과 같은 입력을 효율적으로 읽어야합니다. 첫 번째 줄에는 연관된 정수 값 시퀀스가 ​​포함되고 두 번째 줄에는 다른 시퀀스와 관련된 정수 값 시퀀스가 ​​포함됩니다. 예컨대 :C/C++에서 행을 읽고 파싱합니다. 배열 또는 벡터 또는 유사한 구조의 토큰을 넣으십시오.

3 2 1 4 5 7 6  
3 1 2 5 6 7 4 
7 8 11 3 5 16 12 18 
8 3 11 7 16 18 12 5 
255 
255 

I 함수 모두 배열의 첫번째 줄과 다른 두 번째 넣어 전달한다.

C/C++에서 어떻게 읽어야합니까? 나는 C 방법으로 생각하고 있었지만, 나의 접근법은 2를 가지고 있었을 것이다 ... 나는 scanf를 사용하여 선호도를 읽었지만, 원하는대로 파싱을 할 수있다.

제발,이 newb 도와주세요!

답변

3

std::getline()을 사용하여 행을 읽으십시오. 그런 다음 std::stringstream을 사용하여 각 행을 구문 분석하십시오. 이것이 경쟁을위한 것이므로 실제 코드를 원하지 않을 것입니다.

+0

경쟁용이 아니므로 교육용입니다. 우리는 대학이 개발 한 플랫폼에서만 코드를 제출하지만 ACM IPC 또는 그와 비슷한 문제가 있습니다. 그래서 어떤 코드라도 도움이 될 것입니다. 고마워, 어쨌든 – neverMind

0

또한 strtok() 및 strdup()를 사용할 수도 있습니다.

example of using strtok()strdup()을 참조하십시오. 그런 다음 strdup()를 사용하여 개별 토큰을 추출합니다. strdup()는 복사본을 복사 할 공간을 할당합니다.

+0

네,하지만'strtok()'는 C 라이브러리에서 최악의 기능을 가진 함수이기 때문에 유사한 기능을 수행하는보다 안전한 함수를 찾고 싶을 수도 있습니다. 'strdup()'는 C90 표준에 없습니다 (저는 C99이 없습니다). 그러나 작성하기는 쉽습니다. –

+0

@David :'strtok'는 인터페이스가 좋지 않다는 것에 동의 하겠지만 솔직히''gets ''보다 더 나쁘다고 주장하고 있습니까? 나는 그 주장이 상당한 정당성을 요구할 것이라고 생각한다. –

+0

@Jerry :'strtok()'는 인터페이스보다 더 중요하다고 믿는 내부 상태를 숨겨 왔으며, 최악의 설계 기능으로 생각합니다. 'gets()'는 경쟁자입니다. –

1
#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <vector> 

typedef std::vector<int> ints_t; 

void dump_ints(const ints_t& input) 
{ 
    std::copy(
     input.begin(), 
     input.end(), 
     std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 
} 

void foo(const ints_t& first, const ints_t& second) 
{ 
    dump_ints(first); 
    dump_ints(second); 
} 

bool parse_line(std::istream& is, ints_t* output) 
{ 
    std::string line; 
    if (std::getline(is, line)) 
    { 
     std::istringstream raw_ints(line); 
     std::copy(
      std::istream_iterator<int>(raw_ints), 
      std::istream_iterator<int>(), 
      std::back_inserter(*output)); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

bool parse(std::istream& is, ints_t* first, ints_t* second) 
{ 
    const bool result = parse_line(is, first) && parse_line(is, second); 
    return result; 
} 

void run(std::istream& is) 
{ 
    while (is) 
    { 
     ints_t first; 
     ints_t second; 
     if (parse(is, &first, &second)) 
     { 
      foo(first, second); 
     } 
    } 
} 

int main() 
{ 
    //if you want to read input from file use ifstream and comment istringstream 
// std::ifstream is("put_here_a_path_to_input_file"); 
    std::istringstream is( 
     "3 2 1 4 5 7 6\n" 
     "3 1 2 5 6 7 4\n" 
     "7 8 11 3 5 16 12 18\n" 
     "8 3 11 7 16 18 12 5\n" 
     "255\n" 
     "255\n" 
     ); 
    run(is); 
} 
관련 문제