可以在没有sprintf
的 C 中将整数转换为字符串?
答案 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 。如果您的平台上没有,则可能会对以下实施感兴趣:
用法:
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.*/