首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新C中的变量时不需要的数组更新

更新C中的变量时不需要的数组更新
EN

Stack Overflow用户
提问于 2022-04-30 01:31:44
回答 1查看 39关注 0票数 1

我试图用sprintf将int转换为char。

代码语言:javascript
复制
    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);
       (...)

当我打印buffer时,一切看起来都很好,因为我只希望它是一个字符串。然后,我想把它存储在一个数组中。具体如下:

代码语言:javascript
复制
typedef struct Unario {
    char * bits ;
} Unario ;

但是,当试图将buffer存储在数组的下一个索引中时,之前保存的所有其他变量都会更新为新的buffer定义。

以下是完整的功能:

代码语言:javascript
复制
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;
};

通过以下输入:

代码语言:javascript
复制
int m[6] = {8,2,8,8,2,3};

以下是不想要的产出:

代码语言:javascript
复制
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

我想要得到的是:

代码语言:javascript
复制
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

附带注意:我不能更改或删除结构,因为它是一组结构的一部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-30 04:12:04

因为您的结构中的位不能存储值,所以它只是一个指针。

所以你必须确保每次你把你的搅拌器藏在什么地方

在您使用的函数中,每次使用sprintf时,都会刷新缓冲区中存储的值。

在这种情况下,您的最终输出必须是缓冲区的最新值。

这意味着,如果将数组从{ 8,2,8,8,2,3 }更改为{ 8,2,8,8,2,4 },则最终输出将全部以1111(缓冲区的最新值)为单位。

下面是保存它的一种方法,我使用2d数组来存储字符串

代码语言:javascript
复制
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;
}

当您注意到原始函数的问题后,您可能会找到更多的解决方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72065052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档