Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中int到string的转换_C - Fatal编程技术网

C语言中int到string的转换

C语言中int到string的转换,c,C,我正在使用itoa函数将int转换为字符串,但它给出了一个错误: undefined reference to `itoa' collect2: ld returned 1 exit status 原因是什么?是否有其他方法执行此转换?使用snprintf,它比itoa更便于移植 );但是,许多编译器和相关的库都支持它 sprintf示例 snprintf示例 这两个函数类似于fprintf,但输出写入数组而不是流。sprintf和snprintf的区别在于,snprintf通过写入最多可存储

我正在使用itoa函数将int转换为字符串,但它给出了一个错误:

undefined reference to `itoa'
collect2: ld returned 1 exit status
原因是什么?是否有其他方法执行此转换?

使用snprintf,它比itoa更便于移植

);但是,许多编译器和相关的库都支持它

sprintf示例

snprintf示例

这两个函数类似于fprintf,但输出写入数组而不是流。sprintf和snprintf的区别在于,snprintf通过写入最多可存储在缓冲区中的字符数来保证缓冲区不会溢出。

通常是这样做的:

char str[16]; // could be less but i'm too lazy to look for the actual the max length of an integer
snprintf(str, sizeof(str), "%d", your_integer);
更好地使用sprintf

char stringNum[20];
int num=100;
sprintf(stringNum,"%d",num);
看这个例子

#include <stdlib.h> // for itoa() call
#include <stdio.h>  

int main() {
    int num = 145;
    char buf[5];

    // convert 123 to string [buf]
    itoa(num, buf, 10);

    // print our string
    printf("%s\n", buf);

    return 0;
}
请看下面的例子

像Edwin建议的那样,使用snprintf:

如果您真的想使用itoa,则需要包含标准库标题

#include <stdlib.h>
我还相信,如果你在Windows上使用MSVC,那么itoa实际上就是itoa


另外,由于您从collect2收到一条消息,您很可能在*nix上运行GCC。

在我继续之前,我必须警告您itoa不是ANSI函数-它不是标准的C函数。您应该使用sprintf将int转换为字符串

itoa有三个论点

第一个是要转换的整数。 第二个是指向字符数组的指针-这是存储字符串的位置。如果传入char*变量,程序可能会崩溃,因此应传入一个正常大小的char数组,它将正常工作。 最后一个不是数组的大小,而是数字的基数-基数10是最有可能使用的数字。 函数返回一个指向第二个参数的指针,该参数存储了转换后的字符串

itoa是一个非常有用的函数,它得到了一些编译器的支持——遗憾的是,与atoi不同,它没有得到所有编译器的支持

如果您仍然想使用itoa,下面是您应该如何使用它。否则,只要您希望以8、10或16为基数输出,就可以使用sprintf进行其他选择:

char str[5];
printf("15 in binary is %s\n",  itoa(15, str, 2));
您可以使用此功能制作自己的itoa:

void my_utoa(int dataIn, char* bffr, int radix){
int temp_dataIn;
temp_dataIn = dataIn;
int stringLen=1;

while ((int)temp_dataIn/radix != 0){
    temp_dataIn = (int)temp_dataIn/radix;
    stringLen++;
}
//printf("stringLen = %d\n", stringLen);
temp_dataIn = dataIn;
do{
    *(bffr+stringLen-1) = (temp_dataIn%radix)+'0';
    temp_dataIn = (int) temp_dataIn / radix;
}while(stringLen--);}
这是一个例子:

char buffer[33];
int main(){
  my_utoa(54321, buffer, 10);
  printf(buffer);
  printf("\n");

  my_utoa(13579, buffer, 10);
  printf(buffer);
  printf("\n");
}
与…合作。像这样使用它,例如:

int someIntToParse;
char resultingString[length(someIntToParse)];

itos(someIntToParse, resultingString, length(someIntToParse));
现在resultingString将保存您的C-“字符串”。

使用snprintf-它是每个编译器中可用的标准。通过使用NULL 0参数调用它来查询所需的大小。为结尾处的null多分配一个字符

int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);

与Ahmad Sirojuddin的实现类似,但语义稍有不同。从安全性的角度来看,每当函数写入字符串缓冲区时,该函数都应该真正知道缓冲区的大小,并拒绝超过缓冲区的结尾进行写入。我猜这是你再也找不到伊托亚的部分原因

此外,以下实现避免了执行两次模块/设备操作

char *u32todec( uint32_t    value,
                char        *buf,
                int         size)
{
    if(size > 1){
        int i=size-1, offset, bytes;
        buf[i--]='\0';
        do{
            buf[i--]=(value % 10)+'0';
            value = value/10;
        }while((value > 0) && (i>=0));
        offset=i+1;
        if(offset > 0){
            bytes=size-i-1;
            for(i=0;i<bytes;i++)
                buf[i]=buf[i+offset];
        }
        return buf;
    }else
        return NULL;
}
以下代码测试上述代码并证明其正确性:

int main(void)
{
    uint64_t acc;
    uint32_t inc;
    char buf[16];
    size_t bufsize;
    for(acc=0, inc=7; acc<0x100000000; acc+=inc){
        printf("%u: ", (uint32_t)acc);
        for(bufsize=17; bufsize>0; bufsize/=2){
            if(NULL != u32todec((uint32_t)acc, buf, bufsize))
                printf("%s ", buf);
        }
        printf("\n");
        if(acc/inc > 9)
            inc*=7;
    }
    return 0;
}

itoa函数未在ANSI-C中定义,因此某些平台默认情况下未实现

snprintf函数是itoa最容易的替代品。然而,整数到ascii函数可以作为整数到ascii转换问题的更好的整体解决方案

itoa的性能也优于snprintf,具体取决于实现。简化的itoa仅支持10个基数的实现,例如:

另一个完整的itoa实施如下:

另一个完整的itoa实施:

下面是一个itoa使用示例:


是的,我已经包括了stdlib.h,但是它的基石不工作。你能帮我举一些例子吗?现在你有一两个例子。sprintf和snprintf之间的另一个区别是它们在C89和更高版本中描述的sprintf标准;C99用于snprintf。值得注意的是,Windows库缺少snprintf函数,或者与标准描述的行为不同。在凌晨2:08保存了我。我的编译器遇到问题,因为它不支持itoa,呃,谢谢。snprintfputting“\0”到我的数组是最后一个元素吗?所以我可以知道它的结尾在哪里?50有点过分-即使是64位整数也不需要49个字符。您的sprintf callMinor中有一个输入错误:char stringNum[21];power2,63所需。我认为在这种情况下值得一提的是,对于新手和专业人士来说,使用固定缓冲区大小和sprintf被认为是不好的做法,也是导致内存损坏、安全问题/漏洞攻击和其他奇怪错误的最常见根源之一。如果可能的话,每当将字符串格式化为缓冲区时,始终使用SNPrTNF,并确保跟踪所使用的缓冲区的大小,也考虑尾随\ 0!看到这个链接,它有一些例子,这将只适用于十进制10转换。我很确定这将不会作为itoa工作,因为没有代码来处理以十进制10为基数的负数。
int someIntToParse;
char resultingString[length(someIntToParse)];

itos(someIntToParse, resultingString, length(someIntToParse));
int length = snprintf( NULL, 0, "%d", x );
char* str = malloc( length + 1 );
snprintf( str, length + 1, "%d", x );
...
free(str);
char string[something];
sprintf(string, "%d", 42);
char *u32todec( uint32_t    value,
                char        *buf,
                int         size)
{
    if(size > 1){
        int i=size-1, offset, bytes;
        buf[i--]='\0';
        do{
            buf[i--]=(value % 10)+'0';
            value = value/10;
        }while((value > 0) && (i>=0));
        offset=i+1;
        if(offset > 0){
            bytes=size-i-1;
            for(i=0;i<bytes;i++)
                buf[i]=buf[i+offset];
        }
        return buf;
    }else
        return NULL;
}
int main(void)
{
    uint64_t acc;
    uint32_t inc;
    char buf[16];
    size_t bufsize;
    for(acc=0, inc=7; acc<0x100000000; acc+=inc){
        printf("%u: ", (uint32_t)acc);
        for(bufsize=17; bufsize>0; bufsize/=2){
            if(NULL != u32todec((uint32_t)acc, buf, bufsize))
                printf("%s ", buf);
        }
        printf("\n");
        if(acc/inc > 9)
            inc*=7;
    }
    return 0;
}
#include <stdbool.h> 
#include <string.h>

// A utility function to reverse a string 
char *reverse(char *str)
{
  char *p1, *p2;

  if (! str || ! *str)
        return str;
  for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
  {
        *p1 ^= *p2;
        *p2 ^= *p1;
        *p1 ^= *p2;
  }
  return str;
}
// Implementation of itoa() 
char* itoa(int num, char* str, int base) 
{ 
    int i = 0; 
    bool isNegative = false; 
  
    /* Handle 0 explicitely, otherwise empty string is printed for 0 */
    if (num == 0) 
    { 
        str[i++] = '0'; 
        str[i] = '\0'; 
        return str; 
    } 
  
    // In standard itoa(), negative numbers are handled only with  
    // base 10. Otherwise numbers are considered unsigned. 
    if (num < 0 && base == 10) 
    { 
        isNegative = true; 
        num = -num; 
    } 
  
    // Process individual digits 
    while (num != 0) 
    { 
        int rem = num % base; 
        str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0'; 
        num = num/base; 
    } 
  
    // If number is negative, append '-' 
    if (isNegative) 
        str[i++] = '-'; 
  
    str[i] = '\0'; // Append string terminator 
  
    // Reverse the string 
    reverse(str); 
  
    return str; 
} 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    int a=54325;
    char buffer[20];
    itoa(a,buffer,2);   // here 2 means binary
    printf("Binary value = %s\n", buffer);
 
    itoa(a,buffer,10);   // here 10 means decimal
    printf("Decimal value = %s\n", buffer);
 
    itoa(a,buffer,16);   // here 16 means Hexadecimal
    printf("Hexadecimal value = %s\n", buffer);
    return 0;
}