1

I'm trying to convert an int to char with sprintf.

    for(int i=0; i<n; i++){
       char buffer[100];
       load = group[i];

       int num = pow(10, (load-1));
       for(int j=(load-2); j>=0; j--){
           num+=pow(10, j);
       }
    
       sprintf(buffer,"%d",num);
       (...)

When I print buffer, everything seems alright, as I just want it to be a string there. Then, I want to store it inside an array. Specifically here:

typedef struct Unario {
    char * bits ;
} Unario ;

But when trying to store buffer inside the next index of the array, all the rest of the variables saved before, update to the new buffer definition.

Here's the full function:

Unario * comprimir_en_unario ( int n, int * grupo ){
    int load;
    int j = 0;
    int SIZE = n*2;
    Unario * comprimiendo = malloc(SIZE * sizeof(comprimiendo));
    
    for(int i=0; i<n; i++){
        char buffer[100];
        load = grupo[i];
        printf("\ngrupo[%d] = %d\n", i, load);

        int num = pow(10, (load-1));
        for(int j=(load-2); j>=0; j--){
            num+=pow(10, j);
        }
        
        sprintf(buffer,"%d",num);
        comprimiendo[j].bits = buffer;
        j++;
        comprimiendo[j].bits = "0";
        j++;
    }
    
    for(int i=0; i<SIZE; i++){
        printf("in %d = %s\n", i, comprimiendo[i].bits);
    }
    return comprimiendo;
};

With the following input:

int m[6] = {8,2,8,8,2,3};

and following unwanted output:

in 0 = 111
in 1 = 0
in 2 = 111
in 3 = 0
in 4 = 111
in 5 = 0
in 6 = 111
in 7 = 0
in 8 = 111
in 9 = 0
in 10 = 111
in 11 = 0

and the one I'm trying to get:

in 0 = 11111111
in 1 = 0
in 2 = 11
in 3 = 0
in 4 = 11111111
in 5 = 0
in 6 = 11111111
in 7 = 0
in 8 = 11
in 9 = 0
in 10 = 111
in 11 = 0

Side note: I can't change the struct nor delete it because its a part of a group of structs.

3
  • Edit the question to provide a minimal reproducible example. Commented Apr 30, 2022 at 1:34
  • Questions seeking debugging help should generally provide a minimal reproducible example of the problem, which includes a function main and all #include directives. This also allows other people to easily test your program, by using copy&paste Commented Apr 30, 2022 at 1:39
  • 2
    You are saving the address of a local variable and using it after the variable is destroyed. Commented Apr 30, 2022 at 2:00

1 Answer 1

2

Because your the bits in your struct can not store values, it is only a pointer

So you have to make sure each time you have stored your stirng somewhere

In your used function, each time you use sprintf, the stored value in buffer will be refreshed

In that case, your final output must be the lastest value of buffer

It means, if you changed the array from { 8,2,8,8,2,3 } to { 8,2,8,8,2,4 }, the final output will be all in 1111(the lastest value of buffer)

Here is one way to save it, I used 2d array to store the string

Unario * comprimir_en_unario(int n, int * grupo) 
{
    int load;
    int j = 0;
    int SIZE = n * 2;
    Unario * comprimiendo = (Unario *)malloc(SIZE * sizeof(Unario));//No need to change.

    char buffer[100][100];//Use 2d array to store the string each time

    for (int i = 0; i < n; i++) 
    {
        load = grupo[i];
        printf("grupo[%d] = %d\n", i, load);
        int num = pow(10, (load - 1));

        for (int j = (load - 2); j >= 0; j--)
        {
            num += pow(10, j);
        }

        sprintf(&buffer[i][0], "%d", num);//Related changes
        comprimiendo[j].bits = &buffer[i][0];//Related changes
        j++;
        comprimiendo[j].bits = "0";
        j++;
    }

    for (int i = 0; i < SIZE; i++) 
    {
        printf("in %d = %s\n", i, comprimiendo[i].bits);
    }
    return comprimiendo;
}

You may find more solutions after you noticed the problem of your origional function

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.