printf变量占位符?它甚至是一件事吗?

时间:2017-12-06 23:42:48

标签: c

#include <stdio.h>
char pos[] = {34,92,48,51,51,91,57,59,57,72,37,115,34}; // "\033[9;9H%s"

main() {
    printf(pos,"Aaaaaaa");              // (1) This doesnt work as intended
    printf("\033[9;9H%s","Aaaaaaa");    // (2) Works as intended
}

那么为什么(2)有效,(1)没有?

2 个答案:

答案 0 :(得分:0)

pos存在两个问题。

首先,你拥有的是一个字符数组,而不是一个以空字符结尾的字符串。您需要在该数组的末尾添加0。

其次,你没有相同的字符。在字符串文字"\033[9;9H%s"中,总共有8个字符,而pos有13个字符。

序列\033表示单个字符,其值为33八进制或27十进制。您改为使用文字字符'\''0''3''3'。所以用27替换92,48,51,51。另外,pos中的第一个和最后一个字符有34个,这是双引号字符"。这些字符不是字符串文字的一部分,但用于在代码中表示它。所以摆脱那些。

pos现在看起来应该是这样的:

char pos[] = {27,91,57,59,57,72,37,115,0};

答案 1 :(得分:0)

你有三个不同之处:

  1. 您不需要初始和最终34字符("),因为字符串(2)不会将其打印出来。

  2. 您需要一个空终结符,以确保您只打印字符串,而不再需要。

  3. 如果\033是转义字符,则其值仅为27,而不是92,48,51,51

  4. 解决了这些差异后,您的pos数组:

    {34,92,48,51,51,91,57,59,57,72,37,115,34}
    

    应该看起来像这样(对齐以匹配原始数组):

                {27,91,57,59,57,72,37,115,0}