0

私はこの問題に対して多くの提案ソリューションを試しましたが、成功しませんでした。

私は、空白で区切られた単語を含むenglish_lineと呼ばれる長さ1000のconst char配列を持っています。この配列は関数に渡されます。この機能は、課題の概要に従ってソリューションを実装するために使用する必要があります。

その配列の内容を一度に 1 単語ずつ別の 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*)'

私はこの問題を解決するために 1 日の大半を費やしました。明らかに、私はこれに関して比較的初心者です。

ヒントや提案は大歓迎です:)

4

4 に答える 4

2

word.c_str()から抜け出すためにconst char*使用しますstd::string

forまた、ネストされたループのポイントがわかりません。代わりに次のようなことを行うこともできます(必要に応じてゼロパディングを使用strncpyして最大 49 をコピーし、文字列の最後が常にゼロになるようにします):charchar

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));
于 2013-05-07T08:15:27.720 に答える
0

string 配列と char 配列の違いに注意してください。char 配列は基本的なデータ型の単純な構造であり、string は実際にはより複雑な構造を持つクラスです。c_str()そのため、文字列の関数を使用してコンテンツを char 配列 (別名 C 文字列) として取得する必要があります。

また、出力配列の末尾にc_str()null 終端 (追加の文字) が追加されていることにも注意してください。'\0'

于 2013-05-07T08:41:51.230 に答える
0

string その配列の代わりに使用できますtemp_eng_word。お気に入り、

std::string temp_eng_word;

問題が解決することを願っています。そして、ループは正しくありません。二次元配列を使っているので確認してください。

于 2013-05-07T09:43:40.873 に答える