【发布时间】:2009-09-23 23:54:12
【问题描述】:
我需要将可变数量的字符写入文件。例如,假设我想打印 3 个字符。 “TO”会将“TO”打印到文件中。 “LongString of Characters”会将“Lon”打印到文件中。
我该怎么做? (字符数在另一个变量中定义)。我知道这是可能的 fprintf(file,"%10s",string),但是 10 是预定义的
【问题讨论】:
我需要将可变数量的字符写入文件。例如,假设我想打印 3 个字符。 “TO”会将“TO”打印到文件中。 “LongString of Characters”会将“Lon”打印到文件中。
我该怎么做? (字符数在另一个变量中定义)。我知道这是可能的 fprintf(file,"%10s",string),但是 10 是预定义的
【问题讨论】:
这个对应你的例子:
fprintf(file, "%*s", 10, string);
但您也提到了最大值,以限制数量:
fprintf(file, "%*.*s", 10, 10, string);
【讨论】:
我相信您需要 "%*s" 并且您需要在字符串之前将长度作为整数传递。
【讨论】:
作为替代方案,为什么不试试这个:
void print_limit(char *string, size_t num)
{
char c = string[num];
string[num] = 0;
fputs(string, file);
string[num] = c;
}
暂时将字符串截断为您想要的长度,然后将其恢复。当然,这不是绝对必要的,但它确实有效,而且很容易理解。
【讨论】:
string的长度至少是num-1,否则你将暂时覆盖一些随机的内存字节!
作为替代方案,您可以从缓冲区创建“c_str”并准备字符串到 printf,就像我在此源中所做的那样:
void print(char *val, size_t size) {
char *p = (char *)malloc(size+1); // +1 to zero char
char current;
for (int i=0; i < size; ++i) {
current = val[i];
if (current != '\0') {
p[i] = current;
} else {
p[i] = '.'; // keep in mind that \0 was replace by dot
}
p[i+1] = '\0';
}
printf("%s", p);
free(p);
}
但它解决了错误的方法。您应该使用格式为“%*s”的 fprintf。
【讨论】: