2013-05-07 6 views
0

Я пробовал много предложений для решения этой проблемы без успеха.C++ Копирование из массива в массив

У меня есть массив const char длиной 1000, называемый english_line который содержит слова, разделенные пробелами. Этот массив передается в функцию. Эта функция должна использоваться для реализации решения в соответствии с нашей краткой информацией о назначении.

Я хочу, чтобы скопировать содержимое этого массива, одно слово в то время, в другой 2D массив, 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

С условием 'j <= 2000' в вашем цикле' for', вы собираетесь зацикливать одно время на многие. –

+0

Я также думаю, что логика в вашей программе немного не работает. Прямо сейчас вы копируете первое слово во все 2000 (или 2001, если не изменяете свое состояние) записи массива. Затем вы копируете второе слово во все 2000 записей массива, перезаписывая первое слово. И так далее. И зачем использовать массив массивов? Почему бы не 'std :: vector'' std :: string'? –

+0

лучше использовать std :: vector с push_back ... Тогда вам не нужно заботиться о размерах – Mario

ответ

2

Использование word.c_str() получить const char* из std::string в

Кроме того, я не понимаю точку вашего вложенного for петли, вы можете чтобы сделать что-то вроде этого вместо (используя strncpy скопировать максимум 49 char с нулевым заполнением, если это необходимо, и обеспечить последний 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 array - простая структура базового типа данных, а строка - это класс, имеющий более сложную структуру. Вот почему вам нужно использовать функцию строки c_str(), чтобы получить содержимое в виде массива символов (a.k.a C-string).

Вы также должны заметить, что c_str() добавляет нулевое завершение (дополнительный символ '\0') в конце своего выходного массива.

0

1) счетный цикл неправильно (Вы должны исправить свои знания массива)

2) строка :: c_str() для преобразования зОго :: строка на символ *

0

Вы можете использовать string вместо этого массива temp_eng_word. Например,

std::string temp_eng_word; 

Надеюсь, что исправит вашу проблему. И петля неверна. Пожалуйста, проверьте это, поскольку вы используете двумерный массив.

+0

Как бы вы сохранили массив 'char *' только в одной строке? Полагаю, вы имели в виду массив 'string' или' vector' 'string'. – zakinster

+0

Если вы можете сохранить, temp [] [] = "abcdef"; Вы также можете написать, std :: string temp = "abcd"; –

+0

'temp [] [] =" abcdef "' не имеет никакого смысла. OP имеет строку, такую ​​как 'str [] =" это предложение ", и он разбивает ее на несколько строк, таких как' result [0] = "this", 'result [1] =" is "', и т. д. Таким образом, 'result' должен быть либо' char [] [] ', либо' string [] ', либо' vector '. – zakinster