Search code examples
ckernighan-and-ritchie

function for reversing an array in C (K&R 2nd ed.)


Trying to do Exercise 1-19 of K&R 2nd ed., e.g. writing a function to reverse a string. I thought I managed, but the print output looks strange :-) If I use STRINGSIZE 5 the output is Original String: hello Reversed String: ollehhello. If I use STRINGSIZE 6 to keep in mind the '\0' string end character and modify the while-loop to while ((outputString[STRINGSIZE - (i + 2)] = inputString[i]) != '\0'), then I get Original String: hello Reversed String: olleh?hello, I guess the ? is some random character coming from a '\0' added to the reversed string in the while-loop at position 5; but hello is again added. Could anyone explain how come hello gets added to the end of olleh and how can I get rid of it so that I only get the proper reversed string ?

Here is the code:

#include <stdio.h>
#define STRINGSIZE 5

void reverseString (char inputString[], char outputString[]);

int main(void) {
    char stringToReverse[] = "hello";
    char reversedString[STRINGSIZE]; 
    reverseString(stringToReverse, reversedString);
    printf("Original String: %s\nReversed String: %s\n", stringToReverse, reversedString);
}

void reverseString (char inputString[], char outputString[]) {
    int i;
    i = 0;
    while ((outputString[STRINGSIZE - (i + 1)] = inputString[i]) != '\0')
        ++i;
}

Solution

  • First I'll suggest that you change this line:

        char reversedString[STRINGSIZE]; 
    

    to

    char reversedString[strlen(stringToReverse) + 1];  // + 1 to make room for the string termination
    

    Then I would do something like:

    void reverseString (char inputString[], char outputString[]) {
        int i;
        int len = strlen(inputString);
        for(i=0; i<len; ++i)
        {
            outputString[len-i-1] = inputString[i];
        }
        outputString[len] = '\0';  // Terminate the string
    }