我使用C ++长时间处理字符串操作但由于某种原因我必须在C中编写代码。我知道在C中,我必须先在字符串操作之前分配内存。我将整数数组转换为一个大字符串,例如
int data[]={1, 102, 3024, 2, 3, 50234, 23} => "1,102,3024,2,3,50234,23"
我使用sprintf将数组中的每个数字转换为字符串并使用strcat连接每个子字符串
char *s, *output_string;
int i, N;
// N is the size of the array and given as parameter of a function
for (i=0; i<N; i++)
{
sprintf(s, "%d", data[i]);
strcat(output_string, s);
}
但它不起作用。我想使用sprintf和strcat这些函数,我是否必须首先分配内存?但是数据[i]的位数是多少的,所以如何判断我应该提前分配多少内存?另外,我怎么知道我必须提前为output_string分配多少内存?感谢
答案 0 :(得分:5)
是的,您需要先为中间结果和最终结果分配空间。
让我们假设(为了参数)每个int最多可以产生10位数的输出:
char intermediate[11];
char *result = malloc(input_count * 11+1);
for (int i=0; i<input_count;i++) {
sprintf(intermediate, "%d", data[i]);
strcat(result, intermediate);
strcat(result, ",");
}
如果你想要足够严重,你可以使用log10
来计算每个数字将产生的位数,然后只分配必要的空间而不是像我这样在最坏的情况下分配在这里完成了。
另请注意,在大多数情况下,如果可用,snprintf
代替sprintf
可能会更好。这使您可以限制产生的输出量,确保不会溢出您提供的缓冲区。
答案 1 :(得分:2)
在C语言中,您需要先为字符串分配内存。
幸运的是,snprintf()
使您能够轻松完成此任务(至少对C而言)。
char *s, *output_string;
int i, N;
// Count size for output_string
int output_size = 0;
for (i=0; i<N; i++) {
output_size += snprintf(NULL, 0, "%d", data[i]);
}
// Allocate space
output_string = malloc(output_size + 1);
// Now fill it
for (i=0; i<N; i++) {
int new_size = snprintf(NULL, 0, "%d", data[i]);
s = malloc(new_size + 1); // Extra space for null terminator
sprintf(s, "%d", data[i]);
strcat(output_string, s);
free(s);
}
答案 2 :(得分:2)
strcat
运行O(N 2 )。即使在今天,这应该是反身 - “禁止”领域。
int need = 1; /* for the trailing nul */
for ( int n = 0; n < N; ++n )
need += snprintf(0,0,"%s%d", n?",":"", data[n]);
{
int used = 0;
char *obuf = malloc(need);
if ( !obuf ) return 0;
for ( int n = 0; n < N; ++n )
used += snprintf(obuf+used,need-used,"%s%d", n?",":"", data[n]);
return obuf;
}