Reputation:
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
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
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
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