我想了解有关C标准库的更多信息,因此我决定仅使用printf
函数来实现putchar
。奇怪的事发生时,我几乎没有开始。我所做的就是写一个循环来打印格式字符串的逐字副本,然后我意识到所有的转义序列(\n
,\t
等)已经存在解析和"正确"输出
这是最小的代码:
int my_printf(const char* s){
size_t i;
char c;
for (i = 0; (c = *(s + i)) != '\0'; ++i){
putchar(c);
}
return 0;
}
int main(void){
my_printf("Here\t1\n0\n");
return 0;
}
我期待输出文字Here\t1\n0\n
,但我得到了:
Here 1
0
知道为什么会这样吗?我的第一个想法是我使用的编译器(gcc)试图通过预分析格式字符串来帮助,但这看起来很奇怪,因为它会导致很多的问题,因为它会破坏任何char
数组。那么,有谁知道为什么会这样?这个行为是在标准中定义的吗?谢谢你的帮助!
编辑:正如mafso在答案中所述,替换是在编译时完成的,是标准。标准的5.1.1.2.1.5节有实际文本。
答案 0 :(得分:3)
转义序列在编译时被替换,而不是在运行时由printf
替换。 "\n"
是一个以 literal 换行符开头的字符串(这是将字面换行符放入字符串的唯一方法)。
字符串printf
解释的唯一部分是转换规范,它始终以%
符号开头(当然还有0终结符),其他每个字符都按字面打印。你不需要做任何进一步的事情。