C 将字符串打印到文件的有效方法

C 将字符串打印到文件的有效方法,c,C,我有一个 char* aString 我想写下介于from和to之间的部分,最有效的方法是什么 我想到了一种一次写1个字符的方法 char* p = aString + from; for (int i =0; i < (to-from); i++) { fprintf(aFile, "%c", p++); } 我想知道是否有更快的方法 写 Don说得对,fwrite是最快的 也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调

我有一个

char* aString
我想写下介于from和to之间的部分,最有效的方法是什么

我想到了一种一次写1个字符的方法

char* p = aString + from;
for (int i =0; i < (to-from); i++) {
    fprintf(aFile, "%c", p++);
}
我想知道是否有更快的方法


Don说得对,fwrite是最快的

也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调用中完成这项工作

printf("%.*s", to - from, aString + from);
这是怎么回事。为字符串提供精度表示,如果首先找到“\0”,则打印的字符数不能超过可以打印的字符数。这样的一句话:

printf("%.5s", "0123456789");
将打印:

01234
接下来,如果需要在运行时指定精度,请将数字替换为*并在字符串之前提供长度作为函数参数:

printf("%.*s", 5, "0123456789");  // same as before
如果您只想打印字符串的一部分,那么这个技巧就太过分了。但与其他格式结合使用,它会非常有用:

printf("Token %d: \"%.*s\"\n",
       tok,
       token_info[tok].len,
       str + token_info[tok].start);

Don说得对,fwrite是最快的

也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调用中完成这项工作

printf("%.*s", to - from, aString + from);
这是怎么回事。为字符串提供精度表示,如果首先找到“\0”,则打印的字符数不能超过可以打印的字符数。这样的一句话:

printf("%.5s", "0123456789");
将打印:

01234
接下来,如果需要在运行时指定精度,请将数字替换为*并在字符串之前提供长度作为函数参数:

printf("%.*s", 5, "0123456789");  // same as before
如果您只想打印字符串的一部分,那么这个技巧就太过分了。但与其他格式结合使用,它会非常有用:

printf("Token %d: \"%.*s\"\n",
       tok,
       token_info[tok].len,
       str + token_info[tok].start);

您可以按如下方式使用fwrite:

char *s = "abcdef";

fwrite(s,sizeof(char),2,stdout); // prints ab

fwrite(s+2,sizeof(char),2,stdout); // prints cd

// In general
fwrite(s+from,sizeof(char),to-from,stdout); // print char bet s[from] to s[to]

如果要写入文件,可以用相应的文件指针替换stdout。

可以使用fwrite,如下所示:

char *s = "abcdef";

fwrite(s,sizeof(char),2,stdout); // prints ab

fwrite(s+2,sizeof(char),2,stdout); // prints cd

// In general
fwrite(s+from,sizeof(char),to-from,stdout); // print char bet s[from] to s[to]

如果要写入文件,可以用相应的文件指针替换stdout。

我怀疑这种技术。根据我的经验,printf在这种情况下不会截断参数。手册页上说:在任何情况下,不存在的或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则字段将展开以包含来自的转换结果。@unwind:您读取了错误的部分。指定的是精度,而不是字段宽度,并且精度对%s有特殊的行为。@unwind-正如jamesdlin正确指出的,在我描述精度时,您指的是字段宽度。仅指定字段宽度时,不使用句点;当同时指定字段宽度和精度时,字段宽度在周期之前,而精度在周期之后。我怀疑这种技术。根据我的经验,printf在这种情况下不会截断参数。手册页上说:在任何情况下,不存在的或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则字段将展开以包含来自的转换结果。@unwind:您读取了错误的部分。指定的是精度,而不是字段宽度,并且精度对%s有特殊的行为。@unwind-正如jamesdlin正确指出的,在我描述精度时,您指的是字段宽度。仅指定字段宽度时,不使用句点;指定字段宽度和精度时,字段宽度在周期之前,而精度在周期之后。