如何在 C 中编写一个可变参数函数,该函数将整数和 returns 它们一起放在一个动态字符串中?
How to write a variadic function in C that takes integers and returns them all together in a dynamic string?
例如:
char* function(int n, ...); //prototype
main()
{
char* s;
s= function(3, 123, 456, 789);
printf("%s", s);
}
我如何编写这个接受整数和 return 这些整数的动态字符串的函数?在尝试解决这个问题时,我遇到了函数 itoa();但是我找不到足够的关于它的东西而且使用它的例子很少一个一个地排序,我应该为那个字符串使用 realloc 因为它的大小会变得越来越大直到我完成?我是否使用 strcat 基本上制作一串字符串?可能是我最大的问题,我什么时候以及如何在所有这些混乱中使用函数 itoa()?
函数应该return
"123456789"
编辑:谢谢大家的帮助,我考虑到了所说的一切并设法解决了这个问题。这是我的最终代码(可能在内存管理方面做得更好):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
char * function(int n, ...);
int main()
{
char* s;
s = function(3, 123, 456, 789);
printf("%s", s);
free(s);
s=function(9, 123,456,789,123,789, 12, 433, 553, 341);
printf("\n%s", s);
return 0;
}
char * function(int n, ...)
{
char str[100]={0};
char* res=0;
int i, br;
va_list args;
va_start(args, n);
for (i = 0; i < n; i++)
{
br=va_arg(args, int);
itoa(br, str, 10);
char* tmp=(char *)malloc(sizeof(str));
strcpy(tmp, res ? res : "");
strcat(tmp, str);
free(res);
res=tmp;
}
va_end(args);
return res;
}
C算法
为一个 int
确定较差的 cast 大小缓冲区。提示:作为文本,INT_MIN
有多长?
分配缓冲区 n*worst_case + 1
.
设置buf[0] = '[=14=]';
,size_t length_used = 0;
与 va_start(), va_arg(), va_end()
和朋友讨论可变参数。一次一个,将 using sprintf()
转换为已用缓冲区的末尾。使用 sprintf()
的 return 值来跟踪缓冲区的已用部分增长了多少。
执行最后的 realloc()
收缩,如果需要,right-size 分配缓冲区。
码码检查分配和打印错误
散散步,享受 week-end 因为 spring 即将到来。 (或者秋天?)
strcat()
不需要。
itoa()
不需要。
高级
要确定 int
中值位的位宽(即使它有填充)使用 IMAX_BITS(INT_MAX)
.
给定位宽求小数位数:
// bit_width * log2(10) rounded up
IMAX_BITS(m)*28/93 + 1
帐户 '-'
。
例如:
char* function(int n, ...); //prototype
main()
{
char* s;
s= function(3, 123, 456, 789);
printf("%s", s);
}
我如何编写这个接受整数和 return 这些整数的动态字符串的函数?在尝试解决这个问题时,我遇到了函数 itoa();但是我找不到足够的关于它的东西而且使用它的例子很少一个一个地排序,我应该为那个字符串使用 realloc 因为它的大小会变得越来越大直到我完成?我是否使用 strcat 基本上制作一串字符串?可能是我最大的问题,我什么时候以及如何在所有这些混乱中使用函数 itoa()? 函数应该return
"123456789"
编辑:谢谢大家的帮助,我考虑到了所说的一切并设法解决了这个问题。这是我的最终代码(可能在内存管理方面做得更好):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
char * function(int n, ...);
int main()
{
char* s;
s = function(3, 123, 456, 789);
printf("%s", s);
free(s);
s=function(9, 123,456,789,123,789, 12, 433, 553, 341);
printf("\n%s", s);
return 0;
}
char * function(int n, ...)
{
char str[100]={0};
char* res=0;
int i, br;
va_list args;
va_start(args, n);
for (i = 0; i < n; i++)
{
br=va_arg(args, int);
itoa(br, str, 10);
char* tmp=(char *)malloc(sizeof(str));
strcpy(tmp, res ? res : "");
strcat(tmp, str);
free(res);
res=tmp;
}
va_end(args);
return res;
}
C算法
为一个
int
确定较差的 cast 大小缓冲区。提示:作为文本,INT_MIN
有多长?分配缓冲区
n*worst_case + 1
.设置
buf[0] = '[=14=]';
,size_t length_used = 0;
与
va_start(), va_arg(), va_end()
和朋友讨论可变参数。一次一个,将 usingsprintf()
转换为已用缓冲区的末尾。使用sprintf()
的 return 值来跟踪缓冲区的已用部分增长了多少。执行最后的
realloc()
收缩,如果需要,right-size 分配缓冲区。码码检查分配和打印错误
散散步,享受 week-end 因为 spring 即将到来。 (或者秋天?)
strcat()
不需要。
itoa()
不需要。
高级
要确定 int
中值位的位宽(即使它有填充)使用 IMAX_BITS(INT_MAX)
.
给定位宽求小数位数:
// bit_width * log2(10) rounded up
IMAX_BITS(m)*28/93 + 1
帐户 '-'
。