如何在C中将整数转换为字符数组? [重复]

问题描述 投票:0回答:3

如何在不使用 sprintf 等函数的情况下,在 C 中正确地将整数转换为字符数组?例如,

Input 
int data0 = 1010 
char data1 [];  

Output
data1[0] = '1'
data1[1] = '0'
data1[2] = '1'
data1[3] = '0'

我怎样才能实现这个目标?

谢谢你

问候,

c integer char
3个回答
1
投票

如果您不想使用任何预定义的函数,例如

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
}

0
投票

对于正整数,这非常简单...您可以从使用模运算符查找最后一位数字开始...

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;
}

注意,这是一个非常简单的实现,并没有处理所有情况(例如,存在最大可能负数的问题,它在多线程环境中不起作用,并且每次执行时都会覆盖之前的结果)调用它,因此在中断处理程序中调用它是危险的,例如)。


0
投票

将整数正确转换为字符数组

形成一个函数并提供指向

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
并且是线程安全的。

[由于问题是一个骗局,因此使这个有趣的答案维基。]

© www.soinside.com 2019 - 2024. All rights reserved.