user10621144
user10621144

Reputation:

Reversing a string word by word

I'm trying to write a program that reverses a string inputted by the user.

Enter a sentence: you can cage a swallow can't you Reversal of sentence: you can't swallow a cage can you

So I thought about scanning for the string character by character. Then copying the string from the end to the beginning into a new string. At this point, I know that I've got a new word every time I see a space, so I have to invert the order of the letters that are between two spaces. Here's my code:

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

int main(){
  char sentence[64], reversal[64], reversal_copy[64];
  int i = 0, index = 0;

  printf("Enter a sentence: ");
  while(sentence[strlen(sentence)-1]!= '\n'){
    scanf("%c", &sentence[i]);
    i++;
  }
  printf("Reversal of sencente: ");
  for(int h = strlen(sentence) - 2, k = 0; h >= 0; h++, k++){
    reversal[k] = sentence[h];
    strcpy(reversal_copy, reversal);
    if(sentence[h] == ' '){
      for(int m = h; m >= index && m <= h; m--, index++){
        reversal[m] = reversal_copy[index];
      }
    }
  }

  printf("Reversal of sentence: %s\n\n", reversal);

  return 0;
}

I get a segmentation fault error and I believe it happens around here:

for(int h = strlen(sentence) - 2, k = 0; h >= 0; h++, k++){
        reversal[k] = sentence[h];

but I don't quite get why. Could you help me with this?

Upvotes: 0

Views: 114

Answers (3)

KintoborML
KintoborML

Reputation: 65

The condition for your first loop to continue is h >= 0, and as you are incrementing h each time this is going to keep getting bigger until it exceeds the size of sentence and throws the error.

If your intention for that loop is to work backwards through sentence then I think you should decrement h and k (h--, k--), but if the intention is to work forwards through sentence then your condition needs to be changed so that the loop finishes once h has reached the end of sentence

Upvotes: 2

xing
xing

Reputation: 2508

The word order can be reversed using a recursive function.

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

void reverse ( char *str, char *original) {
    char temp[strlen ( str) + 1];
    temp[0] = 0;
    int offset = 0;

    if ( 1 == sscanf ( str, "%s%n", temp, &offset)) {
        reverse ( str + offset, original);//recursive call
    }
    else {//at the end of the original string
        *original = 0;//set zero at first character
        return;
    }
    //as recursion unwinds, concatenate the words
    strcat ( original, temp);
    if ( str != original) {//will be false when unwinds reaches first iteration
        strcat ( original, " ");
    }
    return;
}

int main( void) {
    char text[] = "you can cage a swallow can't you";

    printf ( "%s\n", text);
    reverse ( text, text);
    printf ( "%s\n", text);

    return 0;
}

Upvotes: 1

alk
alk

Reputation: 70931

For starters:

During the while-loop's 1st iteration strlen() is called on an un-initialised variable. This invokes undefined behaviour. Anything can happen.


In any case of updating a char-array character by character you completely ignore the fact that a 0-terminator is necessary to make a char-array a C-string. Only a C-string may be passed to (most of the) str*() functions.


Also scanf() might fail. Test for this.

Upvotes: 0

Related Questions