2016-11-29 1 views
-1

input1function 문자열 (첫 번째 단어는 input1)에 포함하고 arguments 문자열 (나머지는 input1을 포함)로 나눠야합니다. function 문자열과 arguments 문자열을 인쇄하려고하면 빈 것으로 표시됩니다.왜이 분할 기능이 작동하지 않습니까?

어떻게해야합니까?

void split (string input1, string function, string arguments){ 

    bool args = false; 

    string undefined; 

    for (int i = 0; i < input1.length(); i++){ 

     if (input1[i] == ' '){ 
      if (i == 0) { 
       input1.erase(0, 1); 
      } else if (i == (input1.length() - 1)){ 
       input1.erase((input1.length() - 1), 1); 
      } else { 
       if (!args) { 
        for (int o = 0; o < undefined.length(); o++) 
         function.push_back(undefined[o]); 
        args = true; 
       } else if (args) { 
        for (int u = 0; u < undefined.length(); u++) 
         arguments.push_back(undefined[u]); 
       } 
      } 

     } else { 
      if (i == (input1.length() - 1)){ 
       undefined.push_back(input[i]); 
       if (!args) 
        for (int u = 0; u < undefined.length(); u++) 
         function.push_back(undefined[u]); 
       else 
        for (int e = 0; e < undefined.length(); e++) 
         arguments.push_back(undefined[e]); 
      } else { 
       undefined.push_back(input[i]); 
      } 
     } 
    } 
} 
+0

이 질문은 C++와 비슷한 것으로 간주되므로 c 태그를 제거하십시오. –

+7

디버거를 사용하여 코드를 단계별로 실행하는 방법을 배워야 할 수도 있습니다. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : ** [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

왜 내가 이런 부끄러운 의심을 가지고 있습니까? 문자열에서 단어를 추출하기 위해 지나치게 복잡해 보입니까? 왜 전화가 지워지 죠? – PaulMcKenzie

답변

2

면책 조항 :이 답변은 가정, 당신은 std::string을 사용하고 있습니다. 이 기능은 기본적으로 그 시점에서 비어있는 복사a, bc 기능 split (bc으로 전달하는 그런 다음이

string a = "input"; 
string b; 
string c; 

split(a, b, c); 

처럼라고

void split (string input1, string function, string arguments){ 

).

  1. 를 사용하여 포인터 :

    void split (string input1, string * function, string * arguments) { 
        [...] 
    } 
    split(a, &b, &c); 
    
  2. 사용 참조 :

    void split (string input1, string & function, string & arguments) { 
        [...] 
    } 
    split(a, b, c); 
    

옵션 2 개 가죽 기능 split 그 수정할 수하기 위해서는 두 가지 옵션이 있습니다 사실, 호출자의 bc은 수정 될 것이지만, 옵션 1에서는 function 또는 arguments*function 또는 *arguments으로 모두 변경해야하거나 두 번째 참조 초기화 (예 : 어쨌든 더 선호 할 것입니다.)를 추가해야 할 수 있기 때문에 구현해야합니다. 사실, 당신은) 그 PARAMS을 수정하는 거라고 :

void split (string input1, string * _function, string * _arguments) { 
    string & function = _function; 
    string & arguments = _arguments; 
    [...] 
} 

를 제공 한 실제 작업에 따라, 기능 split 당신이 그것을 어떻게보다 훨씬 쉽게 구현 될 수 있습니다. 하나의 힌트가 PaulMcKenzie에 의해 부여되어 std::istringstream이고 단어를 추출하는 데는 operator >>입니다.

+0

옵션 2는 값을 수정할 수 있다는 사실을 어떻게 숨 깁니까? 저것은 lvalue 참조가있는 것입니다. 또한 참조를 다루는 것이 더 쉽기 때문에 옵션 2, 옵션 1을 만들 것입니다. – NathanOliver

+0

@NathanOliver는'split (a, b, c);와 구분되지 않지만'split (a, & b, &c);' –

관련 문제