想要在没有 itoa 函数的情况下将整数转换为字符串

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

我想在 C 中转换

int to char
* 而不使用
itoa()
函数。

因为在我的 Linux 系统上,i

itoa
功能不存在。我正在使用从here

找到的代码

我想在使用 Linux 的嵌入式设备上运行此功能。

所以我正在寻找不使用

itoa

我不想使用

sprintf
也因为它仅用于打印。

所以请任何人帮助我解决这个问题。

谢谢

c linux embedded
5个回答
7
投票

事情是

snprintf
是完美的功能:

char str[LEN];
snprintf(str, sizeof(str), "%d", num);

5
投票

这是您可以使用的简单片段。有更优雅和更高级的方法,但这可以完成工作。

在过去的嵌入式项目中,我测得它比 sprintf() 效率大约高 1000 倍。 此代码也符合 MISRA-C 标准。

void getDecStr (uint8_t* str, uint8_t len, uint32_t val)
{
  uint8_t i;

  for(i=1; i<=len; i++)
  {
    str[len-i] = (uint8_t) ((val % 10UL) + '0');
    val/=10;
  }

  str[i-1] = '\0';
}

3
投票
#include <stdio.h>
#include <string.h>

#if 0
char *strrev(char *str){
    char c, *front, *back;

    if(!str || !*str)
        return str;
    for(front=str,back=str+strlen(str)-1;front < back;front++,back--){
        c=*front;*front=*back;*back=c;
    }
    return str;
}
#endif

char *itoa(int v, char *buff, int radix_base){
    static char table[] = "0123456789abcdefghijklmnopqrstuvwxyz";
    char *p=buff;
    unsigned int n = (v < 0 && radix_base == 10)? -v : (unsigned int) v;
    while(n>=radix_base){
        *p++=table[n%radix_base];
        n/=radix_base;
    }
    *p++=table[n];
    if(v < 0 && radix_base == 10) *p++='-';
    *p='\0';
    return strrev(buff);
}

int main ()
{
  int i;
  char str[33];

  printf ("Enter a number: ");
  scanf ("%d",&i);

  itoa (i,str,10);
  printf ("decimal: %s\n", str);

  itoa (i, str, 16);
  printf ("hexadecimal: %s\n", str);

  itoa (i, str, 2);
  printf ("binary: %s\n", str);

  return 0;
}

0
投票

我使用了上面用户1089679发布的功能并解决了大多数其他用户提出的评论。如果有人愿意向我提供有关 i_to_a 函数(最好是整个程序)的反馈,以便我可以改进,我将不胜感激。请随意批评和详细(如果你在做的时候很友善,那就太好了:)):

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int no_of_digits( int num, int radix );
char *i_to_a( char *str, int digit_count, int num, int radix );

int main()
{
  int num, radix;

  printf( "Enter a decimal number: " );
  scanf( "%d", &num );
  printf( "Enter radix: " );
  scanf( "%d", &radix );

  int digit_count = no_of_digits( num, radix );
  char *str = malloc( sizeof( char ) * ( digit_count + 1 ) );
  if( str == NULL )
  {
    printf( "Malloc failed in main, exiting.\n" ); //do additional error handling as needed
    return 0;
  }
  str = i_to_a( str, digit_count, num, radix );
  printf( "\nThe converted number as a string is: %s\n", str );
  free( str );
  return 0;
}

int no_of_digits( int num, int radix )
{
  int digit_count = 0;

  if( num < 0 )
    digit_count++;

  while( num != 0 )
  {
    digit_count++;
    num /= radix;
  }
  return digit_count;
}

char *i_to_a( char *str, int digit_count, int num, int radix )
{
  if( num == 0 )
  {
    *str = '0';
    return str;
  }

  unsigned int unum = num;
  if( num < 0 )
    unum = -1 * num;

  str[digit_count] = '\0';
  while( unum > 0 )
  {
    str[digit_count-1] = unum % radix + '0';
    unum /= radix;
    digit_count--;
  }

  if( digit_count == 1 )
    str[0] = '-';

  return str;
}

-1
投票

我找到了有关此问题的解决方案..

我很高兴,我想要我所期望的。

#include <string.h>
#include <stdlib.h>

char *i_to_a(int num);

int main()
{

    char *str = i_to_a(4567);
    printf("%s",str);
    free(str);
    str = NULL;
return 0;

}
int no_of_digits(int num)
{
    int digit_count = 0;

    while(num > 0)
    {
        digit_count++;
        num /= 10;
    }

    return digit_count;
}


char *i_to_a(int num)
{
    char *str;
    int digit_count = 0;

    if(num < 0)
    {
        num = -1*num;
        digit_count++;
    }

    digit_count += no_of_digits(num);   
    str = malloc(sizeof(char)*(digit_count+1));

    str[digit_count] = '\0';

    while(num > 0)
    {
        str[digit_count-1] = num%10 + '0';
        num = num/10;
        digit_count--;
    }

    if(digit_count == 1)
        str[0] = '-';

    return str;
}
© www.soinside.com 2019 - 2024. All rights reserved.