在C语言中,我想将变量integer的值作为字符串存储到另一个变量中。我如何才能做到这一点?示例如下:
int num1 = 123456789;
字符串我想把num1的值作为字符串存储在另一个变量中。
bn31dyow1#
确定存储值所需的字符串大小的典型方法是使用snprintf两次。第一次,你传递一个NULL指针(第一个参数实际上是不相关的,但是传递NULL可以让读者清楚地看到发生了什么),它的限制为零,这样就不会写入任何数据,但是你使用返回值来学习所需的大小。然后分配空间并写入数据。例如:
snprintf
#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构建的,一些微不足道的防御性编程使它变得没什么大不了的:
char s[1024]
#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; }
型
lqfhib0f2#
如果您需要避免先找到所需的字符串大小,然后再分配大小的2遍转换,请考虑从最坏情况大小开始的1步方法。要形成一个 string,首先确定所需字符数组的最大大小。十进制数字的数量可以通过知道int或sizeof(int)*CHAR_BIT - 1中二进制值位的数量来近似,比例为log 102或0.301......,刚好小于28/93*1。因此,所需的位数不超过(sizeof(int)*CHAR_BIT - 1)*28/93 + 1。为潜在的符号位加上1,为 *null字符 * 加上1,我们得到:
int
sizeof(int)*CHAR_BIT - 1
(sizeof(int)*CHAR_BIT - 1)*28/93 + 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);
ruarlubt3#
sprintf将数据类型转换为字符串
log10(abs(digit))适用于负,但是我们必须为负比特添加1个额外比特,
len =(log10(abs(digit)+ 2
对于正整数len =(log10(abs(digit)+ 1如果整数是0,那么对于integer = 0,len = 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); }
字符串
0pizxfdo4#
来自https://cplusplus.com/reference/cstdlib/itoa/的提示可能会有所帮助。malloc(sizeof(int)*8+1)。在malloc之后使用sprintf。
malloc(sizeof(int)*8+1)
sprintf
4条答案
按热度按时间bn31dyow1#
确定存储值所需的字符串大小的典型方法是使用
snprintf
两次。第一次,你传递一个NULL指针(第一个参数实际上是不相关的,但是传递NULL可以让读者清楚地看到发生了什么),它的限制为零,这样就不会写入任何数据,但是你使用返回值来学习所需的大小。然后分配空间并写入数据。例如:字符串
另一个完全合理的方法,实际上可能更合理,是简单地分配一个大缓冲区。例如,只需执行
char s[1024]
并完全跳过malloc。如果需要,可以在编译时检查系统限制,并使用调整到所需大小的缓冲区,但这样做实际上没有任何好处。通过分配1024个字节,当计算机足够大时,当作为字符串写入时,long long的最大值超过1023个字符时,您将面临程序失败的风险,但在相当长的一段时间内,这不应该是一个问题。如果这一天真的发生了,一台计算机是用一个超过3000位的long long构建的,一些微不足道的防御性编程使它变得没什么大不了的:型
lqfhib0f2#
如果您需要避免先找到所需的字符串大小,然后再分配大小的2遍转换,请考虑从最坏情况大小开始的1步方法。
要形成一个 string,首先确定所需字符数组的最大大小。
十进制数字的数量可以通过知道
int
或sizeof(int)*CHAR_BIT - 1
中二进制值位的数量来近似,比例为log 102或0.301......,刚好小于28/93*1。因此,所需的位数不超过
(sizeof(int)*CHAR_BIT - 1)*28/93 + 1
。为潜在的符号位加上1,为 *null字符 * 加上1,我们得到:字符串
现在打印出来。
型
ruarlubt3#
sprintf将数据类型转换为字符串
log10(abs(digit))适用于负,但是我们必须为负比特添加1个额外比特,
len =(log10(abs(digit)+ 2
对于正整数len =(log10(abs(digit)+ 1
如果整数是0,那么对于integer = 0,len = 1。
字符串
0pizxfdo4#
来自https://cplusplus.com/reference/cstdlib/itoa/的提示可能会有所帮助。
malloc(sizeof(int)*8+1)
。在malloc之后使用sprintf
。