-1

Input: Hello there boy(any 80 character string)

Expected output: boy there Hello

Current output: (nothing - does compile though) \

私のハードウェアプロンプト:

1 つ以上のスペースで区切られた単語のシーケンスをユーザーに求めるプログラムを作成します。各単語は英数字のシーケンスです。入力されたテキスト文字列の長さは 80 文字以下であり、各単語の長さは 20 文字以下であると想定できます。fgets() コマンドを使用して、入力テキスト文字列を読み取ります。たとえば、char 配列 char 文 [81]; を宣言できます。次に fgets(sentence,81,stdin); を使用します。標準入力 stdin (つまり、キーボード入力) から最大 80 文字を文字配列 文 [] に読み込みます。これにより、配列の最後にヌル文字 (文字列終了文字) も挿入されます。これが、配列が入力されたテキストよりも 1 バイト長くなる必要がある理由です。プログラムは、各単語間にスペースを 1 つだけ入れて入力したとおりに、逆の順序で単語を出力する必要があります。句読点や制御文字が入力されていないと想定できます。プログラムは reverse_words.c という名前にする必要があり、出力は以下の例に示す出力と正確に一致する必要があります。

私は他の例を見て、私が知っていることを使ってこのプログラムを作成しようとしました。私にはうまくいくように見えますが、うまくいきません。誰かが私のロジックがオフになっている場所を見つけるのを手伝ってくれませんか?

#include <stdio.h>


int main()
{
   char sentence[81];
   char space[81];
   int i , h = 0, j, start;

   printf("Enter a sentance (up to 80 characters): ");
   fgets(sentence,81,stdin);

   //starting backwards go from element 80 to find first non space
   //make array to store element numbers of sentence in new array
   for(i = 80; i >= 0; i--)
   {
     if(sentence[i] != ' ' || sentence[i] != '\0')
     { start = i;
       //printf("%i", start);
     }
    if(i < start && i == ' ')
   {
     space[h] = i;
     h++;
  }
}

h = 0;

  //start at first space and print characters till next space, repeat till all words printed
  for( j = space[h]; j < space[h + 1]; h++)
  {
     printf("%c", sentence[j]);
     if (j == space[h + 1])
        printf(" ");
  }
  return 0;
}
4

5 に答える 5

2

ぱっと見から

if(i < start && i == ' ')

への変更

 if(i < start && sentence[i] == ' ')

その他の改善点:

80 からループしないでください。代わりに、入力された文字列の長さを見つけてから逆方向に進みます。使用するstrlen

于 2012-11-12T07:26:01.160 に答える
0

これを実行しようとするコードは次のとおりです。

int len=strlen(sentence);
for(i=0;i<len;i++)
   space[i]=sentence[len-1-i];
space[i]='\0'
int start=0,end;
for(i=0;i<=len;i++)
{     
   if(space[i]!=' ' || space[i]!='\0')  //edited in place of && it should be ||
   {}
   else 
   {
      end=i-1;
      str_rev(&space[start],&space[end]);
      start=i+1;
   }
}


void str_rev(char *s,char*e)
{
   while(s>e)
   {
      char tmp=*s;
      *s=*e;
      *e=tmp;
      s++;
      e--;
   }
}
于 2012-11-12T07:34:48.963 に答える
0

コメントで述べたように、これは再帰の完璧な質問です。そのため、このソリューションを共有したいと思いました。もちろん、何が起こっているのかを完全に理解していない限り、それを使用しないでください:)

#include <stdio.h>

void PrintWordsInReverseOrder(char* sentence)
{
    // Search beginning of word (skipping non-readable characters <= ' ')
    char* start = sentence;
    while ((*start != '\0') && (*start <= ' ')) start++;
    if (*start == '\0') return; // this is the end my friend
    // Search end of word (skipping readable characters > ' ')
    char* end = start;
    while (*end > ' ') end++; // will also stop at '\0'
    if (*end != '\0')
    {   // We are not at the end of the string, so there might be a next word available.
        // Print the next word using recursion (this causes to print out the last word first)
        PrintWordsInReverseOrder(end + 1);
    }
    char endBackup = *end;
    *end = '\0'; // temporary terminate the word so we can print it out (don't be affraid, we have a backup in endBackup)
    printf(start);
    printf(" ");
    *end = endBackup; // restore word termination char
}

int main()
{
    char sentence[81];
    printf("Enter a sentance (up to 80 characters): ");
    fgets(sentence, sizeof(sentence), stdin);
    PrintWordsInReverseOrder(sentence);
    return 0;
}
于 2012-11-12T08:04:33.613 に答える
0

コードのこの部分は、少しクリーンアップできます。

//starting backwards go from element 80 to find first non space
//make array to store element numbers of sentence in new array

80 文字から戻る代わりに、strlen()of を使用しsentenceます。

printf("Enter a sentence (up to 80 characters): ");
fgets(sentence, 81, stdin);
start = (int) strlen(sentence) - 1; /* subtract one to account for null character */

次に、その値から戻って作業します。

for (i = start; i >= 0; i--) {
    /* ... */
}

文の最大長を表す定数を定義して使用することで、コードの全体的な品質を向上させることもできます。

#define MAX_SENTENCE_LENGTH 80
...
char sentence[MAX_SENTENCE_LENGTH + 1];
char space[MAX_SENTENCE_LENGTH + 1];
...
printf("Enter a sentence (up to %d characters): ", MAX_SENTENCE_LENGTH);
fgets(sentence, MAX_SENTENCE_LENGTH + 1, stdin);

次に、別の制限を使用する場合は、1 か所のコードを変更するだけで済みます。

于 2012-11-12T07:30:25.150 に答える
0

これを試して:

  #include <stdio.h>
  #include <conio.h>

void main()
{
   int x=0,y=0,t,i=0,j=1,k=0,p[10];
   char a[80],b[80];
   clrscr();
   printf(" enter a string ");
   gets(a);
   p[0]=0;
   //count char in string
   while(a[i]!= '\0')
   {
      i++;
      //array p[] note the space position in string
      if(a[i]==' ')
      {
         p[j]=i;
         j++;
      }
   }
   k=i;
   t=0;
   //loop till space to next space
   for(j=j-1;j>=0;j--)
   {    
      x=p[j];
      y=x;
      //reposition the words
      while(x<k)
      {
         // put space when it come to first position
         // because at the beginning there is no space
         if (x==0)
         {
            b[t]= ' ';
            t++;
         }
         b[t]=a[x];
         t++;
         x++;
      }
      k=y;
   }
   puts(b);
   getch();
}
于 2012-11-12T09:19:24.387 に答える