在 C 中更新变量时不需要的数组更新
Unwanted array update when updating a variable in C
我正在尝试使用 sprintf 将 int 转换为 char。
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
时,一切似乎都很好,因为我只希望它是一个字符串。
然后,我想将它存储在一个数组中。具体在这里:
typedef struct Unario {
char * bits ;
} Unario ;
但是当尝试将 buffer
存储在数组的下一个索引中时,之前保存的所有其余变量更新为新的 buffer
定义。
完整函数如下:
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;
};
使用以下输入:
int m[6] = {8,2,8,8,2,3};
和以下不需要的输出:
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
以及我想要得到的那个:
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
旁注:我不能更改结构也不能删除它,因为它是一组结构的一部分。
因为你的结构中的位不能存储值,它只是一个指针
所以你必须确保每次你把你的搅拌器存放在某个地方
在你使用的函数中,每次使用sprintf时,buffer中存储的值都会被刷新
在这种情况下,您的最终输出必须是缓冲区的最新值
也就是说,如果把数组从{8,2,8,8,2,3}改成{8,2,8,8,2,4},最后输出的都是1111 (缓冲区的最新值)
这是一种保存方式,我用二维数组来存储字符串
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;
}
在您注意到您的原始功能的问题后,您可能会找到更多解决方案
我正在尝试使用 sprintf 将 int 转换为 char。
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
时,一切似乎都很好,因为我只希望它是一个字符串。
然后,我想将它存储在一个数组中。具体在这里:
typedef struct Unario {
char * bits ;
} Unario ;
但是当尝试将 buffer
存储在数组的下一个索引中时,之前保存的所有其余变量更新为新的 buffer
定义。
完整函数如下:
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;
};
使用以下输入:
int m[6] = {8,2,8,8,2,3};
和以下不需要的输出:
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
以及我想要得到的那个:
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
旁注:我不能更改结构也不能删除它,因为它是一组结构的一部分。
因为你的结构中的位不能存储值,它只是一个指针
所以你必须确保每次你把你的搅拌器存放在某个地方
在你使用的函数中,每次使用sprintf时,buffer中存储的值都会被刷新
在这种情况下,您的最终输出必须是缓冲区的最新值
也就是说,如果把数组从{8,2,8,8,2,3}改成{8,2,8,8,2,4},最后输出的都是1111 (缓冲区的最新值)
这是一种保存方式,我用二维数组来存储字符串
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;
}
在您注意到您的原始功能的问题后,您可能会找到更多解决方案