我用的使用混淆%c和%s下面的C程序
#include<stdio.h>
void main()
{
char name[]="siva";
printf("%s\n",name);
printf("%c\n",*name);
}
Run Code Online (Sandbox Code Playgroud)
输出是
siva
s
Run Code Online (Sandbox Code Playgroud)
为什么我们需要使用指针来显示字符%c,并且字符串不需要指针
我使用时收到错误
printf("%c\n", name);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
Run Code Online (Sandbox Code Playgroud)
Kom*_*dia 71
如果你试试这个:
#include<stdio.h>
void main()
{
char name[]="siva";
printf("name = %p\n", name);
printf("&name[0] = %p\n", &name[0]);
printf("name printed as %%s is %s\n",name);
printf("*name = %c\n",*name);
printf("name[0] = %c\n", name[0]);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
Run Code Online (Sandbox Code Playgroud)
所以'name'实际上是指向内存中字符数组的指针.如果你尝试读取0xbff5391b的前四个字节,你会看到's','i','v'和'a'
Location Data
========= ======
0xbff5391b 0x73 's' ---> name[0]
0xbff5391c 0x69 'i' ---> name[1]
0xbff5391d 0x76 'v' ---> name[2]
0xbff5391e 0x61 'a' ---> name[3]
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string
Run Code Online (Sandbox Code Playgroud)
要打印字符,您需要将字符的值传递给printf.该值可以作为name [0]或*name引用(因为对于数组名称=&name [0]).
要打印字符串,您需要将指向字符串的指针传递给printf(在本例中为'name'或'&name [0]').
ale*_*oot 12
%c
Run Code Online (Sandbox Code Playgroud)
是为单个字符设计的一个char,所以它只打印一个元素.将char数组作为指针传递给你传递数组的第一个元素的地址(即一个字符),然后打印:
小号
printf("%c\n",*name++);
Run Code Online (Sandbox Code Playgroud)
将打印
一世
等等 ...
%s不需要指针,因为它可以直接使用字符串.
您将解除引用运算符*与指针类型注释*混淆.基本上,在C*中意味着不同的地方有不同的东西:
数组的名称是其第一个元素的地址,指向包含字符串“siva”的内存的指针name 也是如此。
而且你不需要指针来显示字符;在这种情况下,您只是选择直接从数组中使用它。你可以这样做:
char c = *name;
printf("%c\n", c);
Run Code Online (Sandbox Code Playgroud)