sprintf反转一个int并存储为char

时间:2019-11-23 06:23:53

标签: c string

我正在尝试将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.
}

2 个答案:

答案 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转换为相反位置的字符表示形式。