在没有sprintf的情况下将整数转换为C中的字符串

时间:2012-08-05 20:31:08

标签: c type-conversion printf

可以在没有sprintf C 中将整数转换为字符串

5 个答案:

答案 0 :(得分:6)

有一个非标准功能:

char *string = itoa(numberToConvert, 10); // assuming you want a base-10 representation

编辑:似乎你想要一些算法来做到这一点。以下是基础10中的方法:

#include <stdio.h>

#define STRINGIFY(x) #x
#define INTMIN_STR STRINGIFY(INT_MIN)

int main() {
    int anInteger = -13765; // or whatever

    if (anInteger == INT_MIN) { // handle corner case
        puts(INTMIN_STR);
        return 0;
    }

    int flag = 0;
    char str[128] = { 0 }; // large enough for an int even on 64-bit
    int i = 126;
    if (anInteger < 0) {
        flag = 1;
        anInteger = -anInteger;
    }

    while (anInteger != 0) { 
        str[i--] = (anInteger % 10) + '0';
        anInteger /= 10;
    }

    if (flag) str[i--] = '-';

    printf("The number was: %s\n", str + i + 1);

    return 0;
}

答案 1 :(得分:5)

这是一个如何运作的例子。给定缓冲区和大小,我们将继续除以10并用数字填充缓冲区。如果缓冲区中没有足够的空间,我们将返回-1

int
integer_to_string(char *buf, size_t bufsize, int n)
{
   char *start;

   // Handle negative numbers.
   //
   if (n < 0)
   {
      if (!bufsize)
         return -1;

      *buf++ = '-';
      bufsize--;
   }

   // Remember the start of the string...  This will come into play
   // at the end.
   //
   start = buf;

   do
   {
      // Handle the current digit.
      //
      int digit;
      if (!bufsize)
         return -1;
      digit = n % 10;
      if (digit < 0)
         digit *= -1;
      *buf++ = digit + '0';
      bufsize--;
      n /= 10;
   } while (n);

   // Terminate the string.
   //
   if (!bufsize)
      return -1;
   *buf = 0;

   // We wrote the string backwards, i.e. with least significant digits first.
   // Now reverse the string.
   //
   --buf;
   while (start < buf)
   {
      char a = *start;
      *start = *buf;
      *buf = a;
      ++start;
      --buf;
   }

   return 0;
}

答案 2 :(得分:4)

您可以在可用的情况下使用 itoa 。如果您的平台上没有,则可能会对以下实施感兴趣:

https://web.archive.org/web/20130722203238/https://www.student.cs.uwaterloo.ca/~cs350/common/os161-src-html/atoi_8c-source.html

用法:

char *numberAsString = itoa(integerValue); 

<强>更新

基于R ..的评论,可能值得修改现有的itoa实现以接受来自调用者的结果缓冲区,而不是让itoa分配并返回缓冲区。

这样的实现应该同时接受缓冲区和缓冲区的长度,注意不要写入调用者提供的缓冲区的末尾。

答案 3 :(得分:4)

不幸的是,在你需要编制一串字母数字字符的情况下,上面的答案都无法真正解决。我见过的确有很奇怪的案例,尤其是在采访和工作中。

代码中唯一不好的部分是你需要知道整数的边界,这样你就可以正确地分配“string”。

尽管C被称为可预测的,但如果你在编码中丢失,它在大型系统中可能会有奇怪的行为。

下面的解决方案返回一个带有空终止字符的整数表示字符串。这不依赖于任何外部函数,也适用于负整数以及 !!

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


void IntegertoString(char * string, int number) {

   if(number == 0) { string[0] = '0'; return; };
   int divide = 0;
   int modResult;
   int  length = 0;
   int isNegative = 0;
   int  copyOfNumber;
   int offset = 0;
   copyOfNumber = number;
   if( number < 0 ) {
     isNegative = 1;
     number = 0 - number;
     length++;
   }
   while(copyOfNumber != 0) 
   { 
     length++;
     copyOfNumber /= 10;
   }

   for(divide = 0; divide < length; divide++) {
     modResult = number % 10;
     number    = number / 10;
     string[length - (divide + 1)] = modResult + '0';
   }
   if(isNegative) { 
   string[0] = '-';
   }
   string[length] = '\0';
}

int main(void) {


  char string[10];
  int number = -131230;
  IntegertoString(string, number);
  printf("%s\n", string);

  return 0;
}

答案 4 :(得分:0)

    int i = 24344; /*integer*/
    char *str = itoa(i); 
    /*allocates required memory and 
    then converts integer to string and the address of first byte of memory is returned to str pointer.*/