2

文字列を逆にすることができます。たとえば、「文字列を逆にする」を「gnirtsを削除する」に逆にすることができます。しかし、「stringareverse」のように一語一語逆にすることはできません。

void reverseString(char string[],char *start, char* end)
{

    char tmp; //temporary variable to swap values
    int count = 0;
    while(start<end)
    {
        if(*start==' ')
        {
            printf("found space count %d \n",count);
            reverseString(string,start-count,start);
        }
        tmp = *start;
        *start = *end;
        *end = tmp;
        *start++;
        *end--;
        count++; 
    }

    printf(" string %s \n", string); 
}

int main()
{
    char string[] = "reverse a string word by word";
    char *start =string;
    char *end =start+ strlen(string) -1;
    reverseString(string,start,end);
    return 0;
}
4

11 に答える 11

3

すでに行ったことを実行してから、結果全体を逆にします (スペースを特別に扱わずに)。

于 2013-03-13T16:26:25.370 に答える
2

これが道です。文字列全体だけでなく、単語ごとに文字列を逆にすることもできます。コードを調べて、ロジックが役立つかどうかを確認してください。

#include <stdio.h>
#include <string.h>

void stringrev(char *);
void reverseWords(char *);
void reverseString(char* , int);

int main()
{

    char string[] = "reverse a string word by word";
    reverseWords(string);
    printf("\nWord-Wise Reversed String : %s\n",string);
    stringrev(string);
    return 0;

}

void reverseWords(char * str)
{
    int i = 0, j = 0;
    reverseString( str, strlen(str) ); 
    while( 1 ) // Loop forever
    {
        if( *(str+j) == ' ' || *(str+j) == '\0') // Found a word or reached the end of sentence
        {
            reverseString( str+i, j-i );
            i = j+1;
        }
        if( *(str+j) == '\0')
        {
            break;
        }
        j++;
    }
}

void reverseString(char* str, int len)
{
    int i, j;
    char temp;
    i=j=temp=0;

    j=len-1;
    for (i=0; i<j; i++, j--)
    {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
}

void stringrev(char *str)
{
    int i=-1,j=0;
    char rev[50];

    while(str[i++]!='\0');

        while(i>=0)
         rev[j++] = str[i--];

    rev[j]='\0';

    printf("\nComplete reverse of the string is : %s\n",rev);    
}
于 2013-03-13T17:05:17.547 に答える
1

この問題にはスタック実装を使用してください

Step1: 文字列をファイルに書き込む

Step2: ファイルからこれを読み取り、リンクされたリストにプッシュします

Step3: この連結リストでスタック実装を使用する

Step4: リンクリストを先頭から最後までポップ!!

その逆です....!!

于 2013-03-13T16:55:50.057 に答える
0

あまり効率的ではありませんが、うまくいくはずです:

void reverse_string_word(char *data)
{
    char *saveptr;
    char *word;
    char *tmp = malloc(strlen(data) + 1);
    char *tmp2 = malloc(strlen(data) + 1); 

    *tmp = 0;
    *tmp2 = 0;

    word = strtok_r(data, " ", &saveptr);
    if (word)
    {
        strcpy(tmp, word);
    }
    while (word)
    {
       word = strtok_r(NULL, " ", &saveptr);
       if (word)
       {
          sprintf(tmp2, "%s %s", word, tmp);
          strcpy(tmp, tmp2);
       }
    }
    strcpy(data, tmp);
    free(tmp);
    free(tmp2);
}
于 2013-03-13T17:09:50.440 に答える
0
'i love india' return as  'india love i'
'     i love india' return as 'india love      i'
#include<stdio.h>
#include<malloc.h>
#include<string.h>
void reve(char [],int,int);
void main()
{
  char *a;
  int i,j=-1;
  a=(char*)malloc(1000*sizeof(char));
  gets(a);
  for(i=0;a[i]!='\0';i++)
  {
    if(a[i]!=' '&&j==-1)
     j=i;
     if((a[i]==' '&&a[i+1]!=' '&&j>=0)||a[i+1]=='\0')
     {
        a[i]==' '?reve(a,j,i-1):reve(a,j,i);
        j=-1;                
      }
 } 
  reve(a,0,i-1);
  for(i=0;a[i]!='\0';i++)
  printf("%c",a[i]); 

}

void reve(char a[],int j,int i)
{
  char temp;
  if(a[0]==' ')
  j=0;
 for(;i!=j&&j<i;i--,j++)
 {
     temp=a[j];
      a[j]=a[i];
      a[i]=temp;
  }

}

于 2016-06-02T11:47:43.370 に答える
0

それを単語の配列( char** )に分割し、それを逆にしてから再度連結します。

于 2013-03-13T17:27:25.160 に答える