为什么putchar打印格式化输出?

时间:2014-08-04 22:36:32

标签: c string escaping string-formatting

我想了解有关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节有实际文本。

1 个答案:

答案 0 :(得分:3)

转义序列在编译时被替换,而不是在运行时由printf替换。 "\n"是一个以 literal 换行符开头的字符串(这是将字面换行符放入字符串的唯一方法)。

字符串printf解释的唯一部分是转换规范,它始终以%符号开头(当然还有0终结符),其他每个字符都按字面打印。你不需要做任何进一步的事情。