Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reversing the word order in a string in place

I'm trying to reverse the order of words in a sentence in place, eg:

This sentences words are reversed.

becomes

reversed. are words sentences This

This is what I have so far, which almost works: I use the strrev function to reverse the string, and then the inprev function to send each word to the strrev function individually, to reverse them back to the original orientation, but in reversed order. Sending a pointer for the start and end of the strrev function might seem a bit silly, but it allows the same function to be used in inprev(), sending off a pointer to the start and end of individual words.

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

void strrev(char * start, char * end);
void inprev(char * start);

int main(void)
{
   char str[] = "Foobar my friends, foobar";
   char * end = (str + strlen(str) -1);
   puts(str);
   strrev(str, end);
   puts(str);
   inprev(str);

   puts(str);

   return 0;
}

void strrev(char * start, char * end)
{
   char temp;

while (end > start)
   {
     temp = *start;
     *start = *end;
     *end = temp;
      start++;
      end--;
   }
}

void inprev(char * start)
{
     char * first = start;
     char * spcpnt = start;
     while (*spcpnt)
     {
        while (*spcpnt != ' ' && *spcpnt)
           spcpnt++;
        strrev(start, spcpnt-1);         // removing the -1 sends the space on the 
        start = spcpnt++;                // other side to be reversed, doesn't stop 
                                         // the problem.  

     }

}

Here is the output:

Foobar my friends, foobar

raboof ,sdneirf ym rabooF

foobarfriends, my Foobar

The problem is that the lack of a final space at the end of the final word means that a space is missing between that word and the preceeding one in the final string, and instead gets thrown onto the end of the last word, which was the first word in the original string. Sending off the space on the other side of the word only moves the problem elsewhere. Can anyone see a solution?

like image 664
Matt Avatar asked Aug 31 '11 07:08

Matt


People also ask

How do you reverse the order of words in a string?

This can done in many ways. One of the solutions is given in Reverse words in a string . This can be done in more simpler way by using the property of the “%s format specifier” . Property: %s will get all the values until it gets NULL i.e. '\0'.

How do I reverse the order of characters in a string?

Strings can be reversed using slicing. To reverse a string, we simply create a slice that starts with the length of the string, and ends at index 0. The slice statement means start at string length, end at position 0, move with the step -1 (or one step backward).

What does it mean to reverse a string in place?

The in-place reverse means to reverse the string without using the extra space or new variable. In the above approach, we have created the array of char, which means we have used the extra space.


1 Answers

You just need to move the start pointer in the inprev function to skip the space between words. As this appears to be homework (correct me if I'm wrong) I'll just say that all you need to do is move the location of one operator.

But, this produces a problem, namely, the inprev performs a buffer overrun because the search isn't terminated properly. A better way to do it is:

while not end of string
  search for start of word
  start = start of word
  search for end of word
  strrev (start, end)

and that will take care of multiple spaces too. Also, U+0020 (ASCII 32, a space) is not the only white space character. There are standard library functions that test characters. They are in <ctype.h> and start with is..., e.g. isspace.

like image 61
Skizz Avatar answered Sep 19 '22 12:09

Skizz