3

私はコンピューター サイエンスのクラスの宿題に取り組んでおり、かなり退屈な課題の最後の部分は、文を反転できる関数を作成することです。教授から提供された関数プロトタイプは次のようになります。

int reverseSentence(char** sentence, char **
                newsentence, int maxWords)

...ここで、sentence は元の文、newsentence は反転した文をダンプする場所、maxWords は元の文の単語数です。私はこのように私の関数を書きました...

int reverseSentence(char** sentence, char **
                newsentance, int maxWords)
{

    int i = maxWords;
    int x = 0;
    while(i > 0){
        newsentance[x] = sentence[i];
        x++;
        i--;
    }

    return maxWords;
}

ただし、ループは永遠に続くようです。また、 の使い方について誤解しているようですchar**。のような単なる文字列の配列だと思いましたchar[words][characters]。しかし、単語の配列をその形式で関数に渡すことについて警告が表示されます。私は誰かに宿題を頼んでいるわけではありませんchar**.

どんな助けでも大歓迎です。ありがとうございました。

PS - これは私が自分のコードをテストしようとした方法です:

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};
char newsentence[3][4];
reverseSentence(sentence, newsentence, 3);
4

3 に答える 3

4

あなたのコメントに示されているように、コード

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};

は有効ですが、 と互換性がありませんchar **。代わりに、次のようにする必要があります。

char *sentence[3] = {"Hi\n", "my\n", "fri\n"};

最初のものは、次のようにメモリに配置されます。文字は 1 つのブロックにパックされ、それぞれ 4 文字の 3 つのグループになります。

+---+---+---+---+---+---+---+---+---+---+---+---+
| H | i | \n| \0| m | y | \n| \0| f | r | i | \n|
+---+---+---+---+---+---+---+---+---+---+---+---+

配列で使用できる 4 文字には余裕がないため、最後のエントリには末尾の NUL ( ) がないことに注意してください。\0

2 番目の宣言 (必要なもの) は、NUL で終了する文字列への 3 つのポインターの配列です。

+---------------+---------------+---------------+
|    char *     |    char *     |    char *     |
+---------------+---------------+---------------+
       |               |               |
       |               |               |    +---+---+---+---+---+
       |               |               +--> | f | r | i | \n| \0|
       |               |                    +---+---+---+---+---+
       |               |    +---+---+---+---+
       |               +--> | m | y | \n| \0|
       |                    +---+---+---+---+
       |    +---+---+---+---+
       +--> | H | i | \n| \0|
            +---+---+---+---+
于 2012-10-11T22:58:54.827 に答える
3

永遠にループしている理由はわかりませんが、注意すべき点がいくつかあります。

  1. あなたは始めi = maxWordsます...これは間違っているようです。配列は 0 からインデックス付けされるので、設定するとどうなりますi = maxWordsか?
  2. ネーミングがちょっと変。まず、 にタイプミスがありnewsentanceます。次に、それを呼び出しますmaxWordsが、もっと似ているはずnumWordsですよね?
  3. それが「char[words][characters] のような文字列の配列」であると理解している場合、char*C 型についての考え方と実際の存在方法との間には非常に大きなギャップがあります (短い要約は、その型/メモリですCの最も重要で、基本的で、紛らわしい部分の 1 つです)。C で型がどのように表現されるかについて読む教科書はありますか? この課題のためにそれを知る必要があるかどうかさえわかりません...単純に作業することが意図されている可能性があります。

編集ああ、親愛なる。元の文の宣言もコンパイルされますか? よくわかりません。おそらくポインターについてもう一度読みたいと思うでしょう...

于 2012-10-11T22:58:08.587 に答える
0

char** 文を文字列のベクトルと見なすことができます。strlen などの文字列関数を使用できます。たとえば、strlen(sentence[0]) は最初の行の長さを示します。次に、長さ - 1 から 0 に向かって、最後から最初に移動できます。単語カウンターを正しくデクリメントできるように、途中のスペースを数えることを忘れないでください。2 つの単語を区切るスペースが 1 つ以上ある可能性があり、カウンターを減らすときにそれを考慮する必要があることに注意してください。新しい文字列の末尾に '\0' を忘れずに付けてください。

新しい「文字列のベクトル」にコピーするには、malloc と realloc に注意する必要があります。または...最も長い行を検索して、そのサイズのすべての行を割り当てることができます。文字列を出力すると、ベクトルのサイズに関係なく文字 '\0' が表示されると印刷が停止することに注意してください。

于 2012-10-12T02:37:02.030 に答える