#include<stdio.h>
#include<string.h>
void str_reverse(char *str);
void string_reverse(char *str, int length);
int main(void)
{
int len;
/*
* The string str="hello!" is in heap space if
* change it will occur segmentation fault
*/
char *str = "hello!";
char a[] = "hello";
char b[] = "What's fuck!";
char *temp = NULL;
printf("before reverse string is:%s\n", a);
len = strlen(a);
string_reverse(a, len);
printf("after reverse string is:%s\n", a);
printf("before reverse string is:%s\n", b);
str_reverse(b);
printf("after reverse string is:%s\n", b);
return 0;
}
void str_reverse(char *str)
{
char *end = str;
char ch;
// Find the end character of string
/*
*
*
*
* As far as i know and test the following way
* ----------------------------
* while(*end){
* ++end;
* }
* ----------------------------
*
* to walk string is better than
* -------------------
* while(*end++);
* end -= 2;
* -------------------
* because *end
* will over the end of string'\0' that means
* it will go to other's house.
* if the house is not allowed to access and that
* will occur segment fault
*/
while(*end){
++end;
}
--end;
// Reverse the string
while(end > str){
ch = *str;
*str++ = *end;
*end-- = ch;
}
}
void string_reverse(char *str, int length)
{
// Make pointer *end point to the end('\0') of string
char *end = str;
while(*end){
++end;
}
// Make *end point to the last character of string
--end;
// Reverse the string
char temp_c;
// Take half of the length
int half_len = (length >> 1);
while(half_len-- > 0){
temp_c = *str;
*str++ = *end;
*end-- = temp_c;
}
}