user968000
user968000

Reputation: 1843

Reverse a string word by word

I am able to reverse a string. For example, I can reverse "reverse a string" to "esrever a gnirts". But I am not able to reverse it word by word like "string a reverse".

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;
}

Upvotes: 2

Views: 6180

Answers (11)

Garry S
Garry S

Reputation: 89

It shouldn't be as complex as others have posted, please refer this and provide feedback, Happy to improve it.

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


void printWordsInReverse(char str[])
{
    int i;
    int length = strlen(str);

    for(i=length-1; i>=0; i--)
    {
        if(str[i] == ' ')
        {
            /* replace the space with null for the next word */
            str[i] = '\0';
            /* remove the white spaces */
            if(str[i+1] != '\0')
            {
            /* print a word till the null character */
                printf("%s ", &str[i+1]);
            }
        }
    }
    /* print the last word */
    printf("%s", str);
}

int main()
{
    char str[] = "reverse a string";
    printWordsInReverse(str);
    return 0;
}

output : "string a reverse"

Upvotes: 0

Meenakshi Rana
Meenakshi Rana

Reputation: 545

Reverse words in String using C#

public  string ReverseWordsInString(string inputString)
{
    string output = string.Empty;
    string[] splitStrings = inputString.Split(' ');
    for (int i = splitStrings.Length-1; i > -1 ; i--)
    {
        output = output + splitStrings[i]+ " ";
    }
    return output;
}

Upvotes: 1

Somesh
Somesh

Reputation: 1

'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;
  }

}

Upvotes: 0

Somesh
Somesh

Reputation: 1

'My name is' return as 'yM eman si'
     'My name is' return as 'yM      eman si'
 #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;                
      }
 } 
   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;
   }

}

Upvotes: 0

imharindersingh
imharindersingh

Reputation: 196

Read the string from the starting and push each character into a character stack. Once you encounter space or newline or eof, start popping off characters and print them one by one on standard output or store it in a file as you wish.

Upvotes: 0

Barath Ravikumar
Barath Ravikumar

Reputation: 5836

This is the way. I am able to reverse a string word-wise, as well as the entire string. Just go through the code and see if the logic helps.

#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);    
}

Upvotes: 2

Max Tomlinson
Max Tomlinson

Reputation: 95

Here's a Java solution that doesn't use a Scanner or a Stack to parse the words. Starts at the end of the String and works backwards. Could be more elegant but works - if anyone has a recursive java solution I'd like to see it.

"one two three four" is returned as "four three two one" 

private void reverseWordsNoStackNoScanner(String str) {
        System.out.println("reverseWordsNoStackNoScanner "+str);

        String[] buff = new String[str.length()];
        int end=str.length()-1;
        int j=end;
        int start=0;
        int ptr=0;
        for (int i=str.length()-1;i>=0;i--){
            boolean writeBuff=false;
            if (str.charAt(i)!=' ') { // have we backed up to a blank?
                j--; //no
            } else { //yes! write out this word
                writeBuff=true;
            }
            if (i==0) writeBuff=true; //are we done (position 0)?

            if (writeBuff) { //time to write a word?                
                //we've hit a delimiter (or we're done)     
                ptr=j;  //pointing at a blank or the beginning
                ptr++;  //bump past the blank or the beginning
                while(ptr<=end){ //write the word from beginning to finish
                    buff[start++]=String.valueOf(str.charAt(ptr++));
                }
                //don't write a blank when we are on the last word (past the end)
                if (i>0)buff[start++]=" "; 
                j--;
                //set pointers for next iteration
                end=j; //back up end ptr to new 'end' - to parse the next word
            } 
        }
            //print out our reversed word string
        for (String s: buff) {
            System.out.print(s);                        
        }
    }

Upvotes: 0

Arne
Arne

Reputation: 8481

split it into an array of words ( char** ), reverse that and then concatenate it again.

Upvotes: 0

Valeri Atamaniouk
Valeri Atamaniouk

Reputation: 5163

Not very efficient, but should work:

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);
}

Upvotes: 0

Gopichand
Gopichand

Reputation: 1016

Use a stack implementation for this problem

Step1: Write the string into a file

Step2: Read this from the file and push onto linked list

Step3: Use stack implementation on this linked list

Step4: Pop of the linked list starting from head to the end !!

That reverse's it....!!

Upvotes: 1

Steve Jessop
Steve Jessop

Reputation: 279245

Do what you've already done, then reverse the whole result (without treating spaces specially).

Upvotes: 3

Related Questions