0

私はこれを何時間も解決しようとしてきました。研究を含みますが、行きません。基本的に、次の関数を作成する必要があります。

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

文中の単語数を返す場所。

詳細は次のとおりです。

文の大文字化を維持する必要があります。つまり、文が大文字化されている場合は、大文字を保持します。名前などの単語が大文字になっている場合は、大文字を保持します

  • パラメータsentenceは、反転する文を含む文字配列への参照であり、関数によって直接変更しないでください。各単語は文の配列エントリです。
  • パラメータnewsentanceは、新しい文を保持するための文字配列への参照です。
  • パラメータmaxWordsは、文字配列の最大サイズです。
  • 文中の単語数を返す
  • 文字列を一時ストレージにコピーして、文の中で置き換えないでください。ポインタを移動します。

例:「生きるべきか、そうでないか:それが問題です。」になります」質問は、あることです:すること、しないこと、すること。

今、私が抱えている問題は、現在私のコードが機能していることです。しかし、エラーを起こさずに何かを活用する方法を考えることはできないようです。(新しいストレージを作成できないため)。

私がここに持っているのは基本的に私のコードの一部です:

char ** fptr = sentence; //front sentence
char ** lptr = sentence; //last sentence
char ** nptr = newsentance;//front of new sentance

 if( isupper(**fptr)){ //if the first letter of the first word is capital set flag
   capflag = 1;
}
// find last word before null sentence and also calculate size

while(**(++lptr)) 
   ++size;      

 --lptr;

 if(capflag){ 
    *nptr = *lptr;
    **nptr = toupper(**lptr);            //error here
 }  

また、文の最後の「単語」が「」であると想定しなければなりませんでした。そうしないと、文のサイズを計算する方法が見つかりません。誰かが私を助けてくれることを願っています。

私はこれをテストに使用しました:

  char ** test = malloc(1000);
   *test = "To ";
   *(test+1) = "be ";
   *(test+2) = "or ";
   *(test+3) = "not ";
   *(test+4) = "to ";
   *(test+5) = "be ";
   *(test+6) = "";
   char ** ztest = malloc(1000);
   int rs = reverseSentence(test, ztest, 1000 );
4

3 に答える 3

0

以下のコードは私に出力を与えます:

To be or not to be; that is the question.
Number of words: 10
To be or not to be; that is the question.
question. the is that be; to not or be To

ポインターをシャッフル (コピー) するだけです。単語の大文字化を変更しようとはしません。それを行うには、元の文の先頭の単語 (しかし、それが名前であるかどうかをどのように判断しますか?) と最後の単語のコピーを割り当てて、より多くの作業を行う必要があります。文が「ロンドンは 2012 年オリンピックを主催した」であるとします。逆にすると、London の L は大文字と小文字を変換したくありません。なぜなら、London はたまたま文を開始する名前だからです (Olympics の O も大文字と小文字を変換する必要はありません)。

文末のピリオド (ピリオド) をデータに含めるべきではないと正当に判断し (したがって、 my"question."を に置き換える必要があります"question")、文を印刷するコードで最後にピリオドを追加することができます。それは些細な修正です。

#include <stdio.h>

int reverse_sentence(char **fwd_order, char **rev_order, int max_words)
{
     char **end = fwd_order;
     int    num_words = 0;
     for (end = fwd_order; *end != 0 && num_words < max_words; end++)
         num_words++;
     for (int i = 0; i < num_words; i++)
         *rev_order++ = *--end;
     *rev_order = 0;
     return num_words;
}

static void print_sentence(char **words)
{
     const char *pad = "";
     while (*words)
     {
         printf("%s%s", pad, *words++);
         pad = " ";
     }
     putchar('\n');
}

int main(void)
{
     char *sentence[] =
     { "To", "be", "or", "not", "to", "be;", "that", "is", "the", "question.", 0 };
     enum { NUM_WORDS = sizeof(sentence) / sizeof(sentence[0]) };
     char *reversed[NUM_WORDS];
     int num_words;

     print_sentence(sentence);
     num_words = reverse_sentence(sentence, reversed, NUM_WORDS);
     printf("Number of words: %d\n", num_words);
     print_sentence(sentence);
     print_sentence(reversed);
     return(0);
}
于 2012-10-08T07:07:37.043 に答える
0

コードは文字列リテラルを変更しようとしますが、これは未定義の動作です ("ABC"[1] = 48 は実行できません。一部の実装では、文字列リテラルを読み取り専用メモリに配置します)。個々の文字列ごとに malloc を使用してスペースを割り当て、memcpy を使用して各文字列リテラルからデータをコピーしてみてください。

于 2012-10-08T06:56:23.643 に答える
-1

例:「あるべきかどうか、それが問題だ。」となります」質問は、あることです:しないか、するか。

これは仕様の一部ですか、それともあなたの解釈ですか? 後者の場合は、自分の解釈が正しいかどうか、または単純に単語の順序を逆にするだけかどうかを確認する必要があります。これは簡単に実現できます。句読点を処理する必要があるかどうかさえ知っていますか? あなたのコードはそうではなく、あなたのテストはあなたの例と一致しません。

ソフトウェア エンジニアリングの第一のルールは、要件を明確にすることです。

于 2012-10-08T06:57:59.790 に答える