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
75

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.

Discussions

Fastest way to reverse a string in C - Stack Overflow
Is this function the fastest, most optimized way of reversing a string in C? This runs in O(n/2) time. The optimization is that it only iterates through half of the string. char* str_reverse(char ... More on stackoverflow.com
🌐 stackoverflow.com
Efficient ways to reverse a string or int in C#?
var text = "hello world"; var reversed = string.Create(text.Length, text, (chars, state) => { var pos = 0; for (int i = state.Length -1 ; i >=0 ; i--) { chars[pos++] = state[i]; } }); Creating string with no allocation overhead using string.Create Method | text | Mean | Error | StdDev | Median | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated | LinqReverse | Hello World | 209.03 ns | 0.747 ns | 0.583 ns | 208.80 ns | 1.00 | 0.0687 | - | - | 288 B | StringCreate | Hello World | 15.31 ns | 0.164 ns | 0.145 ns | 15.25 ns | 0.07 | 0.0115 | - | - | 48 B | Builder | Hello World | 74.22 ns | 1.186 ns | 0.926 ns | 74.49 ns | 0.36 | 0.0497 | - | - | 208 B | LinqReverse | Ipsum Lorem | 211.74 ns | 3.506 ns | 3.444 ns | 210.26 ns | 1.00 | 0.0687 | - | - | 288 B | StringCreate | Ipsum Lorem | 15.28 ns | 0.039 ns | 0.031 ns | 15.27 ns | 0.07 | 0.0115 | - | - | 48 B | Builder | Ipsum Lorem | 71.87 ns | 0.704 ns | 0.549 ns | 71.69 ns | 0.34 | 0.0497 | - | - | 208 B | LinqReverse | The b(...)y dog [42] | 502.79 ns | 9.722 ns | 10.402 ns | 495.38 ns | 1.00 | 0.1469 | - | - | 616 B | StringCreate | The b(...)y dog [42] | 41.98 ns | 0.623 ns | 0.486 ns | 41.97 ns | 0.08 | 0.0268 | - | - | 112 B | Builder | The b(...)y dog [42] | 240.02 ns | 0.408 ns | 0.319 ns | 239.95 ns | 0.48 | 0.1221 | - | - | 512 B [MemoryDiagnoser] public class StringReverseBench { [Params("Hello World", "The big brown fox jumped over the lazy dog", "Ipsum Lorem")] public string text ; [Benchmark(Baseline = true)] public string LinqReverse() => new string(text.Reverse().ToArray()); [Benchmark] public string StringCreate() { return string.Create(text.Length, text, (chars, state) => { var pos = 0; for (int i = state.Length - 1; i >= 0; i--) { chars[pos++] = state[i]; } }); } [Benchmark] public string Builder() { var sb = new StringWriter(); // uses underlying stringbuilder for (int i = text.Length - 1; i >= 0; i--) { sb.Write(text[i]); } return sb.ToString(); } } More on reddit.com
🌐 r/csharp
32
7
May 19, 2020
How to reverse a string in c without using strrev?
You have string[begin] = '\0' where it should be output[begin] = '\0' More on reddit.com
🌐 r/C_Programming
9
1
September 9, 2019
How to Reverse a String in Cobol?
Been awhile but I thought there was an intrinsic function in cobol85 that does a reverse. More on reddit.com
🌐 r/cobol
4
5
August 7, 2023
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? (6 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? (6 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? (6 Programs)
🌐
Reddit
reddit.com › r/c_programming › how to reverse a string in c without using strrev?
How to reverse a string in c without using strrev? : r/C_Programming
September 9, 2019 - In the end, we explicitly add the end of the character symbol in the string. In the end, we print the reverse string. //Using Recursion In this, we will try to reverse the string using the recursive method. Recursion is a method in which a function gives a call to itself.
🌐
Coderanch
coderanch.com › t › 1010714 › languages › PROGRAMMING-reverse-string-built-functions
C PROGRAMMING Question how to reverse a string in C without using built-in functions (C / C++ forum at Coderanch)
Later on, C++ (with Booch OO design) ... To reverse a string in C without using built-in functions, you can manually swap characters from the start and end of the string, moving towards the center....
🌐
GeeksforGeeks
geeksforgeeks.org › dsa › reverse-a-string
Reverse a String - GeeksforGeeks
Each swap places the correct character in its reversed position, and when both pointers meet in the middle, the entire string becomes reversed.
Published   March 7, 2026
Find elsewhere
🌐
Quora
quora.com › How-do-you-reverse-individual-words-in-a-string-C-strings-and-solutions
How to reverse individual words in a string (C, strings, and solutions) - Quora
Answer: i would char sentence[]=” this is a sentence“; make an array of integers int st[100]={0}; scan through the string from the end . each time you find a space ‘ ‘ write the offset of the next char (start of word) to the array st[] then make the space a 0 value ‘\0’ continue ...
🌐
Linux.org
linux.org › home › forums › general linux forums › general computing
How do I reverse a String in C.....? :< | Linux.org
May 30, 2016 - Print_Reverse_String.c: In function ‘main’: Print_Reverse_String.c:12:4: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration] gets(arr); ^ Print_Reverse_String.c:14:4: warning: implicit declaration of function ‘strrev’ [-Wimplicit-function-declaration] strrev(arr); ^ /tmp/ccirfxGT.o: In function `main': Print_Reverse_String.c:(.text+0x2e): warning: the `gets' function is dangerous and should not be used.
🌐
WsCube Tech
wscubetech.com › resources › c-programming › programs › reverse-string
How to Reverse a String in C? (6 Programs)
April 21, 2026 - Learn How to Reverse a String in C with 6 programs, including loops, recursion, and functions. Easy-to-follow examples for beginners and experts!
🌐
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.
🌐
LeetCode
leetcode.com › problems › reverse-string
Reverse String - LeetCode
The input string is given as an array of characters s. You must do this by modifying the input array in-place [https://en.wikipedia.org/wiki/In-place_algorithm] with O(1) extra memory.
🌐
Sanfoundry
sanfoundry.com › c-program-reverse-string
Reverse a String in C - Sanfoundry
October 18, 2023 - In Recursive Approach, we swap the character at index i with character at index (n-i-1), where n is the size of the string, until i reaches the middle of the string. Examples: Input string: “hello world” “hello world” will be reversed to “dlrow olleh” Reversed string: “dlrow olleh”
🌐
DigitalOcean
digitalocean.com › community › tutorials › reverse-string-c-plus-plus
How to Reverse a String in C++: A Guide with Code Examples | DigitalOcean
April 21, 2025 - Now let us see how we can perform this reverse operation on C++ strings using various techniques. The built-in reverse function reverse() in C++ directly reverses a string.
🌐
Linus Tech Tips
linustechtips.com › software › programming
C Programming - Simple way to reverse a string - Programming - Linus Tech Tips
January 19, 2016 - Right so I made this little C program that lets a user input a string and then outputs that input to the console. I was wondering how I could reverse the string so that whatever the user enters is printed out backwards. Would a for or while loop or something suffice? I'm not really sure how i'd d...
🌐
Sololearn
sololearn.com › en › Discuss › 704578 › reversing-a-string-c
Reversing a string c++ | Sololearn: Learn to code for FREE!
Sololearn is the world's largest community of people learning to code. With over 25 programming courses, choose from thousands of topics to learn how to code, brush up your programming knowledge, upskill your technical ability, or stay informed about the latest trends.
🌐
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.
🌐
Quora
quora.com › How-do-you-write-a-C-program-with-a-function-that-reverses-a-string-to-spell-backwards
How to write a C program with a function that reverses a string to spell backwards - Quora
Answer (1 of 3): either pass two strings in one string you will have string inputted by user. and other string will be empty. pass both strings and run the loop in the function till the 0th character from the length of the input string which will be reverse loop and also initialize another variab...
🌐
ScholarHat
scholarhat.com › home
How to Use Reverse String in C#: Using Array, For Loop & Reverse
September 19, 2025 - Understanding how to reverse a string efficiently also enhances a developer's ability to work with arrays, loops, and built-in methods. In the C# tutorial, we will learn what is reverse string in C#?, how to reverse strings in C#, common use cases and examples, key features and benefits and many more.
🌐
Upgrad
upgrad.com › home › tutorials › software & tech › reverse a string in c
Reverse a String in C | Without strrev & With Examples
October 14, 2024 - Explore upGrad’s Software Engineering ... Reversing a string essentially means swapping the characters at the beginning of the string with those at the end, moving towards the center....