Invert string in C

Posted on

Question :

I’m trying to invert a string into C but the function is cleaning it:

for(i = 0; i < (int)(size/2); i++)
   tmp = buffer[i]; //armazena o character inicial
   buffer[i] = buffer[size - i]; //Troca o character da ponta oposta
   buffer[size - i] = tmp; //Armazena o character inicial no buffer

Why do you clean the string when I re-strlen this string?

The Hello string has 5 characters, so the size variable will have the value 5. ~
changing the values in the above code:

  • tmp = buffer [0] (or the ‘H’ character)
  • buffer [i] = buffer [size – i] (the position where the character H was now has the character value of the position [5 – 0], ie the position 5, which corresponds to the character ‘o’ )
  • buffer [size – i] = tmp (as tmp had the value of the character already buffered [i], then the position of character ‘o’ will have the value of character ‘H’)

Is this analysis correct? What’s the problem?


Answer :

The problem is that “size – i” will get a character in addition to the length of the string. For example, a string with size 5 will have characters in s [0], s [1], s [2], s [3] is [4], but s [5] will be the character 0. Once this character is played in s [0], the string will appear to have zero length from then on, although it still occupies six memory locations.

In my view the program should be fixed to buffer [size – i – 1]. I think (int) in size / 2 is also unnecessary if size is of integer type, because in C an integer division always returns an integer rounded down.


The biggest problem is that you are forgetting to remove 1 in the final position.

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

int main(void) {
    char buffer[] = "Hello";
    size_t size = strlen(buffer);
    for(int i = 0; i < size / 2; i++) {
       char tmp = buffer[i]; //armazena o character inicial
       buffer[i] = buffer[size - i - 1]; //Troca o character da ponta oposta
       buffer[size - i - 1] = tmp; //Armazena o character inicial no buffer
    printf("%s", buffer);
    return 0;

See working on ideone and on CodingGround .


Here is a solution (tested) for the proposed problem:

/* reverse.c */

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

char * reverse( char * s )
    int length = strlen(s) ;
    int c, i, j;

    for (i = 0, j = length - 1; i < j; i++, j--)
        c = s[i];
        s[i] = s[j];
        s[j] = c;

    return s;

int main( void )
    char str[] = "Ola Mundo!";

    printf("%sn", reverse(str) );

    return 0;

/* fim-de-arquivo */


Leave a Reply

Your email address will not be published. Required fields are marked *