nope
nope

Reputation: 223

Strange printf output in C

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

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}

This code basically just initializes an array of values and passes it into a method that reverses these values.

I am not sure if this is the best way to execute the task, since I am new to pointers and arrays in C.

But the real question is this:

Can anyone figure out why in this line

printf("4%s\n",p);

if you remove the preceding '4', so it looks like so

printf("%s\n",p);

the line won't print at all?

Upvotes: 0

Views: 1938

Answers (3)

Andremoniy
Andremoniy

Reputation: 34900

Furthermore, you just a very lucky person, because there is a serious problem with you code: you forget to add \0 symbol at the end of string.

UPD: the main problem is with code line char reversed[size];. It's a regular local variable, it has automatic duration, which means that it springs into existence when the function is called and disappears when the function returns (see this link).

You need to change it to:

char *reversed = malloc((size+1)*sizeof(char));

UPD-2: another bug fixing will be:

1) add array[5] = '\0'; after all other array initializing lines

2) add reversed[j] = '\0'; after for...loop:

for(i = size-1; i >= 0; i--)
{
    reversed[j] = string[i];
    j++;
}
reversed[j] = '\0';

UPD-3: But in general it will much more correctly initialize your string in appropriate way:

char array[10] = "abcde";

Upvotes: 0

Ivaylo Strandjev
Ivaylo Strandjev

Reputation: 70929

You are returning a pointer to local variable(reversed) in the function reverse the question should actually be: Why did it work in the first place?.

This code string = reversed; will only copy the pointer, and again the local copy of the pointer so it has no effect outside the function.

To reverse a string you don't need additional memory - this can be done in-place.

Upvotes: 7

Eran
Eran

Reputation: 729

Strings in C must end with the null character. You're using strlen on a non null-terminated string.

Upvotes: 1

Related Questions