If you want to practice advanced features of C, how about pointers? We can toss in macros and xor-swap for fun too!

#include <string.h> // for strlen()

// reverse the given null-terminated string in place
void inplace_reverse(char * str)
{
  if (str)
  {
    char * end = str + strlen(str) - 1;

    // swap the values in the two given variables
    // XXX: fails when a and b refer to same memory location
#   define XOR_SWAP(a,b) do\
    {\
      a ^= b;\
      b ^= a;\
      a ^= b;\
    } while (0)

    // walk inwards from both ends of the string, 
    // swapping until we get to the middle
    while (str < end)
    {
      XOR_SWAP(*str, *end);
      str++;
      end--;
    }
#   undef XOR_SWAP
  }
}

A pointer (e.g. char *, read from right-to-left as a pointer to a char) is a data type in C that is used to refer to location in memory of another value. In this case, the location where a char is stored. We can dereference pointers by prefixing them with an *, which gives us the value stored at that location. So the value stored at str is *str.

We can do simple arithmetic with pointers. When we increment (or decrement) a pointer, we simply move it to refer to the next (or previous) memory location for that type of value. Incrementing pointers of different types may move the pointer by a different number of bytes because different values have different byte sizes in C.

Here, we use one pointer to refer to the first unprocessed char of the string (str) and another to refer to the last (end). We swap their values (*str and *end), and move the pointers inwards to the middle of the string. Once str >= end, either they both point to the same char, which means our original string had an odd length (and the middle char doesn't need to be reversed), or we've processed everything.

To do the swapping, I've defined a macro. Macros are text substitution done by the C preprocessor. They are very different from functions, and it's important to know the difference. When you call a function, the function operates on a copy of the values you give it. When you call a macro, it simply does a textual substitution - so the arguments you give it are used directly.

Since I only used the XOR_SWAP macro once, it was probably overkill to define it, but it made more clear what I was doing. After the C preprocessor expands the macro, the while loop looks like this:

    while (str < end)
    {
      do { *str ^= *end; *end ^= *str; *str ^= *end; } while (0);
      str++;
      end--;
    }

Note that the macro arguments show up once for each time they're used in the macro definition. This can be very useful - but can also break your code if used incorrectly. For example, if I had compressed the increment/decrement instructions and the macro call into a single line, like

      XOR_SWAP(*str++, *end--);

Then this would expand to

      do { *str++ ^= *end--; *end-- ^= *str++; *str++ ^= *end--; } while (0);

Which has triple the increment/decrement operations, and doesn't actually do the swap it's supposed to do.

While we're on the subject, you should know what xor (^) means. It's a basic arithmetic operation - like addition, subtraction, multiplication, division, except it's not usually taught in elementary school. It combines two integers bit by bit - like addition, but we don't care about the carry-overs. 1^1 = 0, 1^0 = 1, 0^1 = 1, 0^0 = 0.

A well known trick is to use xor to swap two values. This works because of three basic properties of xor: x ^ 0 = x, x ^ x = 0 and x ^ y = y ^ x for all values x and y. So say we have two variables a and b that are initially storing two values va and vb.

  // initially:
  // a == va
  // b == vb
  a ^= b;
  // now: a == va ^ vb
  b ^= a;
  // now: b == vb ^ (va ^ vb)
  //        == va ^ (vb ^ vb)
  //        == va ^ 0
  //        == va
  a ^= b;
  // now: a == (va ^ vb) ^ va
  //        == (va ^ va) ^ vb
  //        == 0 ^ vb
  //        == vb

So the values are swapped. This does have one bug - when a and b are the same variable:

  // initially:
  // a == va
  a ^= a;
  // now: a == va ^ va
  //        == 0
  a ^= a;
  // now: a == 0 ^ 0
  //        == 0
  a ^= a;
  // now: a == 0 ^ 0
  //        == 0

Since we str < end, this never happens in the above code, so we're okay.

While we're concerned about correctness we should check our edge cases. The if (str) line should make sure we weren't given a NULL pointer for string. What about the empty string ""? Well strlen("") == 0, so we'll initialize end as str - 1, which means that the while (str < end) condition is never true, so we don't do anything. Which is correct.

There's a bunch of C to explore. Have fun with it!

Update: mmw brings up a good point, which is you do have to be slightly careful how you invoke this, as it does operate in-place.

 char stack_string[] = "This string is copied onto the stack.";
 inplace_reverse(stack_string);

This works fine, since stack_string is an array, whose contents are initialized to the given string constant. However

 char * string_literal = "This string is part of the executable.";
 inplace_reverse(string_literal);

Will cause your code to flame and die at runtime. That's because string_literal merely points to the string that is stored as part of your executable - which is normally memory that you are not allowed to edit by the OS. In a happier world, your compiler would know this, and cough an error when you tried to compile, telling you that string_literal needs to be of type char const * since you can't modify the contents. However, this is not the world my compiler lives in.

There are some hacks you could try to make sure that some memory is on the stack or in the heap (and is therefore editable), but they're not necessarily portable, and it could be pretty ugly. However, I'm more than happy to throw responsibility for this to the function invoker. I've told them that this function does in place memory manipulation, it's their responsibility to give me an argument that allows that.

Answer from rampion on Stack Overflow
🌐
GeeksforGeeks
geeksforgeeks.org › c language › reverse-string-in-c
Reverse String in C - GeeksforGeeks
The most straightforward method to reverse string is by using two pointers to swap the corresponding characters starting from beginning and the end while moving the indexes towards each other till they meet each other.
Published   December 5, 2024
Top answer
1 of 16
74

If you want to practice advanced features of C, how about pointers? We can toss in macros and xor-swap for fun too!

#include <string.h> // for strlen()

// reverse the given null-terminated string in place
void inplace_reverse(char * str)
{
  if (str)
  {
    char * end = str + strlen(str) - 1;

    // swap the values in the two given variables
    // XXX: fails when a and b refer to same memory location
#   define XOR_SWAP(a,b) do\
    {\
      a ^= b;\
      b ^= a;\
      a ^= b;\
    } while (0)

    // walk inwards from both ends of the string, 
    // swapping until we get to the middle
    while (str < end)
    {
      XOR_SWAP(*str, *end);
      str++;
      end--;
    }
#   undef XOR_SWAP
  }
}

A pointer (e.g. char *, read from right-to-left as a pointer to a char) is a data type in C that is used to refer to location in memory of another value. In this case, the location where a char is stored. We can dereference pointers by prefixing them with an *, which gives us the value stored at that location. So the value stored at str is *str.

We can do simple arithmetic with pointers. When we increment (or decrement) a pointer, we simply move it to refer to the next (or previous) memory location for that type of value. Incrementing pointers of different types may move the pointer by a different number of bytes because different values have different byte sizes in C.

Here, we use one pointer to refer to the first unprocessed char of the string (str) and another to refer to the last (end). We swap their values (*str and *end), and move the pointers inwards to the middle of the string. Once str >= end, either they both point to the same char, which means our original string had an odd length (and the middle char doesn't need to be reversed), or we've processed everything.

To do the swapping, I've defined a macro. Macros are text substitution done by the C preprocessor. They are very different from functions, and it's important to know the difference. When you call a function, the function operates on a copy of the values you give it. When you call a macro, it simply does a textual substitution - so the arguments you give it are used directly.

Since I only used the XOR_SWAP macro once, it was probably overkill to define it, but it made more clear what I was doing. After the C preprocessor expands the macro, the while loop looks like this:

    while (str < end)
    {
      do { *str ^= *end; *end ^= *str; *str ^= *end; } while (0);
      str++;
      end--;
    }

Note that the macro arguments show up once for each time they're used in the macro definition. This can be very useful - but can also break your code if used incorrectly. For example, if I had compressed the increment/decrement instructions and the macro call into a single line, like

      XOR_SWAP(*str++, *end--);

Then this would expand to

      do { *str++ ^= *end--; *end-- ^= *str++; *str++ ^= *end--; } while (0);

Which has triple the increment/decrement operations, and doesn't actually do the swap it's supposed to do.

While we're on the subject, you should know what xor (^) means. It's a basic arithmetic operation - like addition, subtraction, multiplication, division, except it's not usually taught in elementary school. It combines two integers bit by bit - like addition, but we don't care about the carry-overs. 1^1 = 0, 1^0 = 1, 0^1 = 1, 0^0 = 0.

A well known trick is to use xor to swap two values. This works because of three basic properties of xor: x ^ 0 = x, x ^ x = 0 and x ^ y = y ^ x for all values x and y. So say we have two variables a and b that are initially storing two values va and vb.

  // initially:
  // a == va
  // b == vb
  a ^= b;
  // now: a == va ^ vb
  b ^= a;
  // now: b == vb ^ (va ^ vb)
  //        == va ^ (vb ^ vb)
  //        == va ^ 0
  //        == va
  a ^= b;
  // now: a == (va ^ vb) ^ va
  //        == (va ^ va) ^ vb
  //        == 0 ^ vb
  //        == vb

So the values are swapped. This does have one bug - when a and b are the same variable:

  // initially:
  // a == va
  a ^= a;
  // now: a == va ^ va
  //        == 0
  a ^= a;
  // now: a == 0 ^ 0
  //        == 0
  a ^= a;
  // now: a == 0 ^ 0
  //        == 0

Since we str < end, this never happens in the above code, so we're okay.

While we're concerned about correctness we should check our edge cases. The if (str) line should make sure we weren't given a NULL pointer for string. What about the empty string ""? Well strlen("") == 0, so we'll initialize end as str - 1, which means that the while (str < end) condition is never true, so we don't do anything. Which is correct.

There's a bunch of C to explore. Have fun with it!

Update: mmw brings up a good point, which is you do have to be slightly careful how you invoke this, as it does operate in-place.

 char stack_string[] = "This string is copied onto the stack.";
 inplace_reverse(stack_string);

This works fine, since stack_string is an array, whose contents are initialized to the given string constant. However

 char * string_literal = "This string is part of the executable.";
 inplace_reverse(string_literal);

Will cause your code to flame and die at runtime. That's because string_literal merely points to the string that is stored as part of your executable - which is normally memory that you are not allowed to edit by the OS. In a happier world, your compiler would know this, and cough an error when you tried to compile, telling you that string_literal needs to be of type char const * since you can't modify the contents. However, this is not the world my compiler lives in.

There are some hacks you could try to make sure that some memory is on the stack or in the heap (and is therefore editable), but they're not necessarily portable, and it could be pretty ugly. However, I'm more than happy to throw responsibility for this to the function invoker. I've told them that this function does in place memory manipulation, it's their responsibility to give me an argument that allows that.

2 of 16
28

Just a rearrangement, and safety check. I also removed your non-used return type. I think this is a safe and clean as it gets:

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

void reverse_string(char *str)
{
    /* skip null */
    if (str == 0)
    {
        return;
    }

    /* skip empty string */
    if (*str == 0)
    {
        return;
    }

    /* get range */
    char *start = str;
    char *end = start + strlen(str) - 1; /* -1 for \0 */
    char temp;

    /* reverse */
    while (end > start)
    {
        /* swap */
        temp = *start;
        *start = *end;
        *end = temp;

        /* move */
        ++start;
        --end;
    }
}


int main(void)
{
    char s1[] = "Reverse me!";
    char s2[] = "abc";
    char s3[] = "ab";
    char s4[] = "a";
    char s5[] = "";

    reverse_string(0);

    reverse_string(s1);
    reverse_string(s2);
    reverse_string(s3);
    reverse_string(s4);
    reverse_string(s5);

    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);
    printf("%s\n", s4);
    printf("%s\n", s5);

    return 0;
}

Edited so that end will not point to a possibly bad memory location when strlen is 0.

People also ask

What does it mean to reverse a string in C?
Reversing a string means rearranging its characters so that the first becomes the last, the second becomes the second-last, and so on. For example, reversing "hello" results in "olleh".
🌐
wscubetech.com
wscubetech.com › resources › c-programming › programs › reverse-string
How to Reverse a String in C? (8 Programs)
How do I reverse a string in C without using a library function?
You can reverse a string by manually swapping characters using loops (e.g., for or while) or recursion. This eliminates the need for built-in functions like strrev().
🌐
wscubetech.com
wscubetech.com › resources › c-programming › programs › reverse-string
How to Reverse a String in C? (8 Programs)
How can pointers be used to reverse a string?
Pointers can directly manipulate memory. Using two pointers, one pointing to the start and the other to the end of the string, characters can be swapped while moving inward.
🌐
wscubetech.com
wscubetech.com › resources › c-programming › programs › reverse-string
How to Reverse a String in C? (8 Programs)
🌐
Reddit
reddit.com › r/c_programming › how to reverse a string in c without using strrev?
r/C_Programming on Reddit: How to reverse a string in c without using strrev?
September 9, 2019 -

So I have a task which requires me to manipulate arrays and reverse a string. I have written the code but it doesn't work quite perfectly. The problem is that it reverses the string BUT it also includes weird symbols after the reversed string. I'm pretty new to programming and I have tried to find an answer elsewhere but don't know what to look for exactly. I appreciate any constructive feedback, Thanks!

#include <stdio.h>

int main(){

char string[256];
char output[256];
int begin;int end;
int count = 0;

printf("Input a string\n");
fgets(string, 256, stdin);

while (string[count] != '\0'){
count++;

end = count - 1;
}
for (begin = 0; begin < count; begin++) {
output[begin] = string[end];
end--;
}
string[begin] = '\0';

printf("%s\n", output);
}
🌐
WsCube Tech
wscubetech.com › resources › c-programming › programs › reverse-string
How to Reverse a String in C? (8 Programs)
October 23, 2025 - Learn How to Reverse a String in C with 8 programs, including loops, recursion, and functions. Easy-to-follow examples for beginners and experts!
🌐
Javatpoint
javatpoint.com › reverse-a-string-in-c
Reverse a String in C - javatpoint
Reverse a String in C with Tutorial, C language with programming examples for beginners and professionals covering concepts, c pointers, c structures, c union, c strings etc.
🌐
Simplilearn
simplilearn.com › home › resources › software development › c program to reverse a string using different methods
Program to Reverse a String in C Using Different Methods
September 11, 2025 - Learn C program to reverse a string using two different principles and reasoning without utilizing any preset functions with example code. Start learning now!
Address   5851 Legacy Circle, 6th Floor, Plano, TX 75024 United States
🌐
myCompiler
mycompiler.io › view › J6kDIIjqHUv
Reverse String (C) - myCompiler
// Online C compiler to run C program ... fgets(str1, sizeof(str1), stdin); printf("%s", str1); printf("Reversed String: "); for (int i = size - 1; i >=0; i--){ printf('%c', str1[i]); } return 0; } ... This comment belongs to a ...
Find elsewhere
🌐
GeeksforGeeks
geeksforgeeks.org › dsa › reverse-a-string
Reverse a String – Complete Tutorial - GeeksforGeeks
After each swap, increment the left pointer and decrement the right pointer to move towards the center of the string. This will swap all the characters in the first half with their corresponding character in the second half. ... // C++ program to reverse a string using two pointers #include <iostream> using namespace std; string reverseString(string &s) { int left = 0, right = s.length() - 1; // Swap characters from both ends till we reach // the middle of the string while (left < right) { swap(s[left], s[right]); left++; right--; } return s; } int main() { string s = "abdcfe"; cout << reverseString(s); return 0; }
Published   October 3, 2025
🌐
Hero Vired
herovired.com › learning-hub › blogs › reverse-a-string-in-c
C Program to Reverse a String Using for Loop and Recursion
Master cloud architecture, DevOps practices, and automation to build scalable, resilient systems. ... To reverse a string using recursion in C, you can define a recursive function that takes the string as input and returns the reversed string.
🌐
W3Schools
w3schools.in › c-programming › examples › reverse-a-string-in-c
Reverse a String in C
Then a user-defined function, revAString() is declared and in its definition, reversing the string using swapping logic is written. First of all, you take g (a counter variable), a variable numb of type integer and a temporary variable (name tmpry) used for swapping and initialize this temporary variable with 0.
🌐
OneCompiler
onecompiler.com › c › 3x2tgdr3j
Reverse String - C - OneCompiler
#include<stdio.h> #include<string.h> void main() { int i,n; char str[20]; printf("Enter the String to get reversed\n"); gets(str); n=strlen(str); printf("\nReversed string is \n"); for(i=n-1;i>=0;i--) { printf("%c",str[i]); } } created 4 years ago · Write, Run & Share C Language code online using OneCompiler's C online compiler for free.
🌐
Scaler
scaler.com › home › topics › reverse a string in c
Reverse a String in C - Scaler Topics
May 21, 2024 - One can write user defined strrev() function. In the above section, we used an in-built function to reverse the string in C. Let us define our function to do the same.
🌐
GeeksforGeeks
geeksforgeeks.org › c language › strrev-function-in-c
strrev() function in C - GeeksforGeeks
January 10, 2025 - We can create our own strrev() function to reverse a string simply using a loop.
🌐
Programiz
programiz.com › c-programming › examples › reverse-sentence-recursion
C Program to Reverse a Sentence Using Recursion
In this C programming example, you will learn to take a sentence from the user and reverse it using recursion.
🌐
Unstop
unstop.com › home › blog › reverse a string in c in 10 different ways (+code examples)
Reverse A String In C In 10 Different Ways (+Code Examples)
September 13, 2024 - The multiple ways to reverse a string in C include the strevv() function, recursive approach, loops, pointers, stacks, and more. Learn with detailed examples.
🌐
Programming Simplified
programmingsimplified.com › c-program-reverse-string
C program to reverse a string | Programming Simplified
In this case we must reverse the string without strrev (see the next program). Download Reverse string program. ... We find the length of the string without using strlen function and then copy its characters in reverse order (from end to beginning) to a new string using a for loop.
🌐
Cprogramming
cboard.cprogramming.com › c-programming › 97443-reverse-string.html
reverse a string
I would suggest that you reverse the string in place and then print it with "%s" format specifier. That way you save multiple calls to printf. Thank you so much for your suggestion.
🌐
Sanfoundry
sanfoundry.com › c-program-reverse-string
Reverse a String in C - Sanfoundry
October 18, 2023 - In each step we swap both characters, increment the first variable and decrement the second variable until the first is less than the second one. Examples: Input string: “hello world” “hello world” will be reversed to “dlrow olleh” Reversed string: “dlrow olleh”
🌐
Linux.org
linux.org › home › forums › general linux forums › general computing
How do I reverse a String in C.....? :<
May 30, 2016 - There is no Standard Library function for the reversal of a string. You will need to code this yourself. And gets() vs fgets() is not just an opinion. The C99 C Standard depreciates gets(), and the C11 Standard removes gets() completely! Yes, this breaks older code recompiled using C99 & C11 Standards, but can be easily corrected, and should be!
Top answer
1 of 8
4
    while(str[++i]!='\0');

is equivalent to

    while(str[++i]!='\0')
       /*do nothing*/;

which is equivalent to

    ++i;
    while (str[i]!='\0') {
      ++i;
    }

and

    while(i>=0)
      rev[j++] = str[--i];

is equivalent to

    while (i>=0) {
        --i;
        rev[j] = str[i];
        ++j;
    }

Note that i is decremented before the statement since --i is a pre-decrement, whereas j is incremented after the statement since j++ is a post-increment.

2 of 8
2

I'll try to answer as best as i can...

  1. Why while is ended with ;

This is valid syntax, it's often used to cause the program to wait at that line until a certain flag is set in an embedded scenario. In this case it's used to find the length of the string. All strings are terminated with a null character, which is '\0', and the preincrement on i means that after that line i will hold the value for the length of the string. Effectively its equivalent to this:

/* If the ith position of the string is not the end */
 while (str[i] != '\0') {
     /* Increment i and repeat */
     i = i + 1;
}

The main concept here is the difference between postincrement and preincrement operators - might be worth reading up on that.

  1. What does while(str[++i]!='\0'); mean?

See above.

3.Is rev[j++] = str[--i]; same as writing j++; and i--; inside the while loop?

If you're asking if its in the while loop, its entirely equivelant to:

while(i>=0) { rev[j++] = str[i--]; }

Since there is only a single operation in the while loop the brackets aren't needed. Just a note, and this is entirely subjective, but the majority of coding standards I've come accross use brackets even in this scenario.

Your questions seem to be related mainly to the syntax of C - it might be worth getting a book out or watching some tutorials to familiarise yourself with it.