2014-02-07 4 views
0

문자열 (getline()으로 읽음)을 c_strings의 배열로 바꾸기 위해 일부 코드를 작성했습니다. 문제는 내가 읽고있는 항목이 배열에 제대로 저장되지 않는다는 것입니다. 원래는 그 사이의 공백 수를 기반으로 입력을 파싱 한 다음 거기에서 계속 진행하지만 동일한 문제가 발생합니다. 그래서 파싱을 나보다 아래로 바꾸었고 똑같은 문제가 발생했습니다. 파싱은 작동하지만 어딘가에 char * 배열로 파싱 된 내용을 읽는 중일 때 뭔가 잘못 될 수 있습니다.문자열을 c_strings의 배열로 구문 분석

내 코드 :

int i = 0; 
unsigned inputSize = input.size(); 
unsigned int prev = 0; //prev as in previous space position 
while((prev = input.find(' ', prev)) < inputSize) { 
    ++i; ++prev;   
} 
char* charArray[i + 2]; 
memset(charArray, '\0', i + 2); 
stringstream ss(input); 
string buffer; 
for(int a = 0; ss >> buffer; ++a) { 
    charArray[a] = const_cast<char*>(buffer.c_str()); 
} 

내가 일을하고있어 내 입력 공간의 수를 계산하고, 그 숫자 + 2 (+2 내가 필요로하기 때문에의 숯불 * 배열을 만들고있어 것입니다 NULL로 끝내십시오). 그 후 필자는 입력을 분석하여 배열로 읽어들입니다. 나는 charArray에 할당 된 메모리 밖에서 메모리를 할당하지 않기 때문에 ss >> buffer를 my termination 절로 사용하고 있습니다. buffer.c_str은 const char *를 얻습니다. 그래서 const_cast를 char *의 (비 const) 배열에 저장합니다. memset을 사용하여 모든 요소를 ​​NULL로 설정합니다. 마지막 요소를 제외하고 덮어 쓸 것이라는 것을 알기 때문에 NULL로 남겨두고 싶습니다.

테스트 :

Input: Why hello world 
Output: Junk 

내 프로그램 안에 뭐가 잘못이야?

+0

어떻게 코드가하고있는 생각 사용을 말해 약간의 의견은 어떻습니까? – John3136

+0

그냥 넣으십시오.하지만 구문 분석이하는 일에 대해 더 자세히 설명하겠습니다. –

+0

문자열 스트림에 입력을 넣을 수없는 정말 좋은 이유가 있습니까? 예를 들어'std :: vector '과 같은 단어를 읽으시겠습니까? –

답변

0

buffer.c_str()에 의해 반환 된 포인터는 buffer에 저장된 문자열이 수정되지 않는 한 유효합니다. buffer을 수정해야하는 경우 나중에 내용이 필요할 경우 미리 내용을 복사해야합니다.

0

Right way to split an std::string into a vector [duplicate]을 참조하십시오.

Live Example

#include <iostream> 
#include <sstream> 
#include <iterator> 
#include <vector> 
using namespace std; 

int main(int argc, char *argv[]) { 
    std::string input = "Why hello world"; 
    std::stringstream ss(input); 

    std::vector<std::string> vstrings(std::istream_iterator<std::string>(ss), 
     std::istream_iterator<std::string>{}); // C++11 brace syntax 
    char** charArray = new char*[vstrings.size()]; 
    for (unsigned int i = 0; i < vstrings.size(); i++) 
     charArray[i] = (char*)vstrings[i].c_str(); 
    for (unsigned int i = 0; i < vstrings.size(); i++) 
     std::cout << charArray[i] << "\n"; 
    delete[] charArray; 
}