在C语言中使用动态字符串中的malloc将整型变量转换为字符串进行存储

j0pj023g  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(141)

在C语言中,我想将变量integer的值作为字符串存储到另一个变量中。我如何才能做到这一点?
示例如下:

int num1 = 123456789;

字符串
我想把num1的值作为字符串存储在另一个变量中。

bn31dyow

bn31dyow1#

确定存储值所需的字符串大小的典型方法是使用snprintf两次。第一次,你传递一个NULL指针(第一个参数实际上是不相关的,但是传递NULL可以让读者清楚地看到发生了什么),它的限制为零,这样就不会写入任何数据,但是你使用返回值来学习所需的大小。然后分配空间并写入数据。例如:

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

int
main(void)
{
    long long digit = 1234567890;
    size_t len = snprintf(NULL, 0, "%lld", digit);
    char *ptr = malloc(len + 1);
    if( ptr == NULL ){
        perror("malloc");
        return 1;
    }
    sprintf(ptr, "%lld", digit);
    printf("%s\n", ptr);
    return 0;
}

字符串
另一个完全合理的方法,实际上可能更合理,是简单地分配一个大缓冲区。例如,只需执行char s[1024]并完全跳过malloc。如果需要,可以在编译时检查系统限制,并使用调整到所需大小的缓冲区,但这样做实际上没有任何好处。通过分配1024个字节,当计算机足够大时,当作为字符串写入时,long long的最大值超过1023个字符时,您将面临程序失败的风险,但在相当长的一段时间内,这不应该是一个问题。如果这一天真的发生了,一台计算机是用一个超过3000位的long long构建的,一些微不足道的防御性编程使它变得没什么大不了的:

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

int
main(void)
{
    long long digit = 1234567890;
    size_t len = snprintf(NULL, 0, "%lld", digit);
    char a[1024];
    char *ptr = a;
    if( snprintf(ptr, sizeof a, "%lld", digit) >= sizeof a ){
        fprintf(stderr, "Value truncated\n");
        return 1;
    }
    printf("%s\n", ptr);
    return 0;
}

lqfhib0f

lqfhib0f2#

如果您需要避免先找到所需的字符串大小,然后再分配大小的2遍转换,请考虑从最坏情况大小开始的1步方法。
要形成一个 string,首先确定所需字符数组的最大大小。
十进制数字的数量可以通过知道intsizeof(int)*CHAR_BIT - 1中二进制值位的数量来近似,比例为log 102或0.301......,刚好小于28/93*1。
因此,所需的位数不超过(sizeof(int)*CHAR_BIT - 1)*28/93 + 1。为潜在的符号位加上1,为 *null字符 * 加上1,我们得到:

#define LOG10_2_N 28
#define LOG10_2_D 93
#define INT_STRING_SIZE ((sizeof(int)*CHAR_BIT - 1)*LOG10_2_N/LOG10_2_D + 3) 
char buf[INT_STRING_SIZE];

字符串
现在打印出来。

int len = snprintf(buf, sizeof buf, "%d", num1);
assert (len > 0 && (unsigned) len < sizeof buf);
// Allocate a copy if desired.
return strdup(buf);

  • 1 Rare编码也会有填充位,但这只会使我们的缓冲区大小有点太大。这很少是一个问题。
ruarlubt

ruarlubt3#

sprintf将数据类型转换为字符串

log10(abs(digit))适用于负,但是我们必须为负比特添加1个额外比特,

len =(log10(abs(digit)+ 2

对于正整数len =(log10(abs(digit)+ 1
如果整数是0,那么对于integer = 0len = 1

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

int main() {
   long long digit = 1234567890;
   //size required to store the string
   size_t len;

   if(digit < 0) {
     len = (log10(abs(digit))) + 2;
   } else if(digit > 0){
     len = (log10(abs(digit))) + 1;
   } if (digit == 0) len = 1;

   char *ptr = malloc(len);
   //sprintf converts to string
   sprintf(ptr,"%lld",digit);
   printf("%s",ptr);
 }

字符串

0pizxfdo

0pizxfdo4#

来自https://cplusplus.com/reference/cstdlib/itoa/的提示可能会有所帮助。malloc(sizeof(int)*8+1)。在malloc之后使用sprintf

相关问题