我正在尝试将int数组存储为str并以相反的顺序显示它。 只有在打印str时才会出现垃圾。
我的代码有什么问题?
int main() {
int a[] = { 1, 2, 3 }; // Output should be 321 (char)
int size = sizeof(a) / sizeof(int);
char str[size + 1];
int i;
for (size = size - 1; size >= 0; size--) {
sprintf(&str[size], "%d", a[size]);
//printf("%c\n", str[size]);
}
printf("%s\n", str); // I get garbage.
}
答案 0 :(得分:1)
我修改了一些错误修复您的解决方案。对于初学者,您不能假定整数数组仅包含一位数字值。
还有for循环:
for(size=size-1;size >= 0;size--)
看起来很可疑。 (索引变量是基于它的东西吗?)
简单的解决方案
这可能是您的意思:
for(i = 0; i < size; i++) {
sprintf(&str[i],"%d", a[size-1-i]);
}
str[size] = '\0';
或者这个:
str[size] = '\0';
for(i = size-1; i <= 0; i--) {
sprintf(&str[i],"%d", a[size-1-i]);
}
更好的解决方案
如果a
数组中的整数为负,我不确定您期望做什么。因此,-
符号将被插入到str
的位置。
我所拥有的解决方案将首先计算a
中每个整数需要多少个字符。然后它将为此长度分配str
缓冲区(空字符为+1)。
然后,我们利用sprintf
的返回值找出要连接的位置。我们可以使用strcat
,但这可能会更快。
int main() {
int j = 0;
int a[] = { 1,2,3 }; // Output should be 321 (char)
int size = sizeof(a) / sizeof(int);
int length = 1; // +1 for final null char
// Count the size of characters needed for each integer
// Do a dummy sprintf and use its return value to figure out how many chars are needed
for (int i = 0; i < size; i++) {
char tmp[sizeof(int) * 5]; // sizeof(int)*5 is big enough to hold any integer including a negative value
length += sprintf(tmp, "%d", a[i]); // utilize the return value from sprintf and add it to the running length
}
char str[length];
str[0] = '\0'; // initially null terminate our string
// reverse print chars from a into str
for (int i = 0; i < size; i++) { // use i as index variable, not size
j += sprintf(str + j, "%d", a[size - 1 - i]);
}
printf("%s\n", str);
}
答案 1 :(得分:0)
替代解决方案,更接近原始帖子,并且显然不尝试解决一般性问题(假设值是个位数):
int a[]={1,2,3}; // Output should be 321 (char)
int size = sizeof(a)/sizeof(int);
char str[size+1];
for(int i=0; i<size ; i++) {
str[size-1-i] = ‘0’ + a[i];
}
str[size] = 0;
printf("%s\n", str); // I get garbage.
}
利用假定的输入值,将每个int转换为相反位置的字符表示形式。