Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf的实现_C_String_Printf - Fatal编程技术网

C printf的实现

C printf的实现,c,string,printf,C,String,Printf,有人能给我解释一下printf的哪个实现正确地打印字符串吗 第1版: printf(const char * s) { while(*s != '\0') { write(s, 1, f); s++; } } 第2版: printf(const char *s) { write(s, strlen(s), f); } 两者都打印“正确的字符串”。它们甚至可以正确打印参数中的给定字符串 如果您的问题是什么是更好的实现,我建议

有人能给我解释一下
printf
的哪个实现正确地打印字符串吗

第1版:

printf(const char * s) {
     while(*s != '\0') {
          write(s, 1, f);
          s++;
     }
}
第2版:

printf(const char *s) {
     write(s, strlen(s), f);
}
两者都打印“正确的字符串”。它们甚至可以正确打印参数中的给定字符串

如果您的问题是什么是更好的实现,我建议这在很大程度上取决于write的实现

如果写调用的开销足够大,或者可以在提交写操作之前缓冲所有字符,则选项1的速度较慢

如果写入非常未优化,则选项2的速度较慢。例如,它只是将一个字符一个字符地放到串行连接上。在这里,您需要使用strlen为字符串的额外迭代付费

请注意,write调用将文件描述符作为第一个参数,而不是最后一个参数。

两者都正确打印“字符串”。它们甚至可以正确打印参数中的给定字符串

如果您的问题是什么是更好的实现,我建议这在很大程度上取决于write的实现

如果写调用的开销足够大,或者可以在提交写操作之前缓冲所有字符,则选项1的速度较慢

如果写入非常未优化,则选项2的速度较慢。例如,它只是将一个字符一个字符地放到串行连接上。在这里,您需要使用strlen为字符串的额外迭代付费


请注意,write调用将文件描述符作为第一个参数,而不是最后一个参数。

是什么阻止了您自己进行测试?没有,因为您实现了puts而不是printf。printf的整个要点是打印格式化。您的代码没有进行任何格式化。除了前面的注释之外:从性能方面来说,版本2绝对是更好的选择。两个版本都做相同的事情。请定义“正确打印字符串”的含义?是什么阻止您自己进行测试?没有,因为您实现了puts而不是printf。printf的全部要点是打印格式化。您的代码没有进行任何格式化。除了前面的注释之外:从性能方面来说,版本2绝对是更好的选择。两个版本的功能相同。请定义“正确打印字符串”的含义?