2013-05-07 3 views
0

나는이 문제에 대한 많은 제안 해결책을 시도했지만 성공하지 못했습니다.C++ 배열에서 배열로 복사

길이가 1000 인 const char 배열이 english_line이며 공백으로 구분 된 단어가 포함되어 있습니다. 이 배열은 함수로 전달됩니다. 이 기능은 과제 요약에 따라 솔루션을 구현하는 데 사용해야합니다. 나는이 프로그램을 실행할 때

나는 다른 2 차원 배열로 한 번에 그 배열의 내용을 하나 개의 단어를 복사 할, temp_eng_word

char temp_eng_word[2000][50]; 
int j; 

string line = english_line; 
string word; 

istringstream iss(line, istringstream::in); 
while (iss >> word) 
{ 
for (j=0;j<=2000;j++) 
{ 
strcpy(temp_eng_word[j],word); 
} 
} 

`

, 나는 오류를 얻을 :

cannot convert 'std::string* *{aka std::basic_string(char)}' to 'const char*' for argument '2' to 'char* strcpy(char*, const char*)' 

나는이 문제를 해결하기 위해 하루 중 가장 좋은 시간을 보냈습니다. 분명히 나는 ​​이것에 대한 상대적인 초심자이다.

어떤 조언, 제안을 크게 감상 할 수있다 :)

+0

'for' 루프에서'j <= 2000' 조건을 사용하면 한 번에 여러 번 반복 할 것입니다. –

+0

나는 또한 당신의 프로그램에있는 논리가 조금 벗어난 것이라고 생각한다. 지금은 배열의 모든 항목을 모든 2000 (또는 조건을 변경하지 않은 경우 2001)에 복사합니다. 그런 다음 두 번째 단어를 배열의 모든 2000 항목에 복사하여 첫 번째 단어를 덮어 씁니다. 등등. 배열 배열을 사용하는 이유는 무엇입니까? 왜'std :: string'의'std :: vector'가 아닌가? –

+0

더 나은 표준을 사용하십시오 : 벡터 push_back ... 그럼 당신은 크기에 대해 신경 쓸 필요가 없습니다 – Mario

답변

2

사용 word.c_str()는 또한 std::string

밖으로 const char*를 얻기 위해, 당신의 중첩 for 루프의 요점을 이해하지 않습니다, 당신은 할 수 있습니다 대신이 같은 뭔가를 (필요한 경우 제로 패딩 49 char의 최대 복사 strncpy을 사용하고 문자열의 마지막 char을 보장하는 것은 항상 제로) :

,
istringstream iss(line, istringstream::in); 
int nWord = 0; 
while((nWord < 2000) && (iss >> word)) 
{ 
    strncpy(temp_eng_word[nWord], word.c_str(), 49); 
    temp_eng_word[nWord][49] = '\0'; /* if it's not already zero-allocated */ 
    ++nWord; 
} 

참고 단어 저장 std::vector<std::string>를 사용하도록 간단 될 것이라고 : 루프없이 할 수

vector<string> words; 
istringstream iss(line, istringstream::in); 
while(iss >> word) 
{ 
    words.push_back(word); 
} 

std::copy를 사용하여 :

copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(words)); 
+0

제안 해 주셔서 감사합니다. 링크 된 코드를 참조하십시오. http://pastebin.com/xumTLKU0 첫 번째 코드를 시도해 보았습니다. 테스트 할 화면에 인쇄합니다. 각 행의 첫 단어를 건너 뜁니다. 두 번째 줄마다 이전 줄의 마지막 단어가 추가됩니다! - 나중에 일이 발생합니다. 제안 2는 화면에 출력 할 때 각 줄의 첫 번째 단어 만 인쇄합니다. 나는 휴식을 취하고 모든 것을 더 명확하게 생각합니다. 팁 주셔서 감사합니다 - 그것은 나에게 희망을 준다! :) – user2357438

0

참고 문자열과 문자의 차이를 정렬. Char 배열은 기본 데이터 형식의 간단한 구조이며 문자열은 실제로는 더 복잡한 구조를 갖는 클래스입니다. 그래서 c_str() 문자열의 함수를 사용하여 내용을 문자 배열 (a.k.a C- 문자열)로 가져와야합니다.

또한 c_str()은 출력 배열 끝에 null 종료 (추가 문자 '\0')를 추가합니다.

0

대신 해당 배열의 string을 사용할 수 있습니다

2) 문자열 :: c_str() 표준을 변환하는 :: 문자열는 char) 배열 지식을 잘못 수정해야 카운트 temp_eng_word. 좋아요,

std::string temp_eng_word; 

희망 사항은 문제를 해결합니다. 그리고 루프가 올바르지 않습니다. 2 차원 배열을 사용하고 있으므로이를 확인하십시오.

+0

한 문자열'string'에'char *'배열을 어떻게 저장 하시겠습니까? 여러분이'string' 또는'string'의'vector' 배열을 의미한다고 가정합니다. – zakinster

+0

저장할 수 있으면 temp [] [] = "abcdef"; 또한 std :: string temp = "abcd";라고 쓸 수 있습니다. –

+0

'임시 [] [] = "abcdef"'는 의미가 없습니다. OP는'str [] = "this is a sentence"와 같은 문자열을 가지고 있으며'result [0] = "this",'result [1] = "is" 따라서'result'는'char [] []','string []','vector '중 하나 여야합니다. – zakinster

관련 문제