如何在不使用 sprintf 等函数的情况下,在 C 中正确地将整数转换为字符数组?例如,
Input
int data0 = 1010
char data1 [];
Output
data1[0] = '1'
data1[1] = '0'
data1[2] = '1'
data1[3] = '0'
我怎样才能实现这个目标?
谢谢你
问候,
如果您不想使用任何预定义的函数,例如
sprintf()
或 itoa()
,您可以使用 while 循环从头开始实现它,在每次迭代时提取数字。
首先统计输入数字有多少位
int count = 0;
int temp = data0
if(data0==0){
char data1[2];
data1[0] = '0';
data1[1] = '\0';
// can return data1 if inside a function at this point
}
while(temp > 0){
count++;
temp /= 10;
}
声明计算大小的字符数组
char data1[count+1];
现在开始提取数字并将其添加到数组中
temp = data0;
data1[count--]='\0';
while(temp > 0){
int digit = temp%10;
temp /= 10;
data1[count--] = digit + '0';
// count-- adds digits from the back of the array
}
对于正整数,这非常简单...您可以从使用模运算符查找最后一位数字开始...
78332 % 10 --> 2
一旦获得最后一位数字,您可以通过除以 10(整数除法)来删除该数字中的最后一位数字:
78332 / 10 -> 7833
您可以重复此过程,直到提取出所有数字(即直到除法结果为 0)。
对于负数,您只需检查该数一开始是否为负数,如果是,您只需记住该事实并通过更改符号将其变为正数。生成文本表示后,如果数字最初为负数,则必须在开头添加
-
。
代码的简单 C 版本将如下所示:
const char *myitoa(int x) {
static char buf[100];
int p = 98;
int neg = x < 0;
if (neg) x = -x;
do {
buf[--p] = '0' + x % 10;
x = x/10;
} while (x > 0);
if (neg) buf[--p] = '-';
return buf+p;
}
注意,这是一个非常简单的实现,并没有处理所有情况(例如,存在最大可能负数的问题,它在多线程环境中不起作用,并且每次执行时都会覆盖之前的结果)调用它,因此在中断处理程序中调用它是危险的,例如)。
将整数正确转换为字符数组
形成一个函数并提供指向
char
数组及其大小和值的指针。INT_STRING_SIZE
;
从最低有效数字开始,将其分配给数组(从末尾开始)。将值除以 10。重复直到该值为 0。复制到提供的缓冲区中。
// Sample untested code.
#include <string.h>
#include <stddef.h>
#include <stdbool.h>
// Sample untested code.
// C99 or later...
// Return error flag
bool KSon_itoa(size_t sz, char *destination, int value) {
char buf[INT_STRING_SIZE];
size_t offset = INT_STRING_SIZE - 1; // index the last element.
buf[offset] = '\0'; // Null character terminate.
bool sign = value < 0;
// Work with the negative side as there are more negative values.
if (value > 0) {
value = -value;
}
do {
buf[--offset] = '0' - value % 10;
value /= 10;
} while (value);
if (sign) {
buf[--offset] = '-';
}
size_t size_used = (sizeof buf) - offset;
if (size_used < sz) {
// Not enough room.
return true;
}
memcpy(destination, buf + offset, size_used);
return false;
}
适用于整个
int
范围,包括 INT_MIN
并且是线程安全的。
[由于问题是一个骗局,因此使这个有趣的答案维基。]