0

我是 C 语言的新手。但我可以理解为什么下面的代码输出为 'A'

困扰我的一件事是 printf 语句中的数组名称 p。编译器如何处理这个 p?

p 如何在第 5 行之后被字符数组 "%c\n" 替换

我知道这是一个愚蠢的问题,很抱歉发布这只兔子。

谁能帮我理解这背后的概念?

 line1:      #include<stdio.h>
 line2:      int main()
 line3:      {
 line4:          char p[]="%d\n";
 line5:          p[1]='c';
 line6:          printf(p,65);
 line7:          return 0;
             }
4

5 回答 5

6

的第一个参数printf()const char*包含格式说明符的 a。更常见的是将其视为字符串文字:

printf("%c\n", 65);

但是使用包含字符串的变量是合法的。

的分配p[1] = 'c'改变了d缓冲区cp导致字符A(作为65十进制值A)被写入标准输出(作为%c指示printf()打印字符,而不是%d打印数值)。

于 2012-07-25T10:32:00.550 回答
2

您不会替换整个数组,只是替换数组偏移量 #1 处的字符(第二个字符)。您将其替换为 'c' 使内容为 "%c\n" 当用作格式化字符串时,将整数 65 格式化为大写拉丁语 A

于 2012-07-25T10:29:46.590 回答
1

在第 6 行:
printf(p,65);
将更改为
printf("%c\n",65); 'A' 的 Ascii 值为 65。
http://www.asciitable.com/

于 2012-07-25T10:33:30.597 回答
0

解释如下:

char p[]="%d\n";

上述执行后,P 将包含 -> "%d\n"

 line5:          p[1]='c';

在这里,P 现在将是“%c\n”,因为您正在更改基于零的索引的第 1 个字符。

line6:          printf(p,65);

这相当于:

printf("%c\n",65)

或者

printf("%c\n",'A')

因此你得到A的输出

于 2012-07-25T10:32:34.127 回答
0
     #include<stdio.h>
       int main()
       {
          char p[]="%d\n";   #This is stored at p[1]
          p[1]='c'           # d is replaced by c
          printf(p,65);      # p is taken as p[1] and is replaced by "%c\n"
           return 0;
         }

输出:A#ASCII 值 65

如果您将值设为 66,则输出将为“B”,依此类推。

于 2012-07-25T10:41:25.303 回答