c - 使用 printf 和不使用 printf 实现 itoa 函数时出现的问题

标签 c pointers itoa

我只是为我自己的 itoa 编写了一段代码(仅针对正数),并且尝试使其尽可能高效,我显示了函数内部和 main 中的值,并且它可以工作,但是当我删除 printf 时函数内部的行代码不再起作用,有人知道为什么吗?

这就是它的工作原理

enter image description here

这是行不通的地方

enter image description here

感谢您的宝贵时间! 祝你有美好的一天

代码:

#include<stdio.h>
#define uint8_t unsigned char
#define uint16_t unsigned int

/*Prototipos de funciones*/
uint8_t *UART0_itoa(uint16_t number, uint8_t base);

/*Función principal*/
void main(){
    uint8_t *cadena;
    cadena = UART0_itoa(255, 16);
    printf("The String in main: %s\n",cadena);
}

/*Declaración de funciones*/
uint8_t *UART0_itoa(uint16_t number, uint8_t base){
  uint8_t *aux;
  *aux = '\0';
  while(number){
    *--aux = (number%base>9)?(number%base)+'7':(number%base)+'0';
    number/=base;
  }
  //printf("The String in the function: %s\n",aux);
  return aux;
}

最佳答案

问题是您没有为 aux 分配任何内存 - 它是一个未初始化的指针。您写入其中的任何内容(包括 *aux = '\0' 的初始赋值)都是未定义的行为。

您需要更改代码以获取输出缓冲区,或使用 malloc 动态分配它。尝试向后写入数字是一个很好的方法 - 您可以通过传递缓冲区末尾来使其工作,如下所示:

uint8_t *UART0_itoa(uint16_t number, uint8_t base, char *aux){
    while(number){
        *--aux = (number%base>9)?(number%base)+'7':(number%base)+'0';
        number/=base;
    }
    return aux;
}

并调用

char buf[16];
cadena = UART0_itoa(255, 16, &buf[15]);

关于c - 使用 printf 和不使用 printf 实现 itoa 函数时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477744/

相关文章:

c++ - 在 C++ 中制作指向结构或对象的指针数组

C 指针算术异常行为

c - 堆栈头部和尾部更新为相同的值但仅在 head-C 编程上调用更新

c++ - 不透明指针应该使用未命名的结构还是未定义的标记来实现?

c++ - 是否可以将可变参数宏字符串化为逗号分隔的字符串列表?

c++ - itoa 到 std::to_string

c - 指导我将数字除以 10,然后转换为字符串

在C中创建字符串

c - 通过 C 中的方法动态分配和填充变量

c - 使用 fprintf 引起的无限循环