C 带printf的字符串和字符
我对在下面的c程序中使用C 带printf的字符串和字符,c,printf,C,Printf,我对在下面的c程序中使用%c和%s感到困惑 #include <stdio.h> void main() { char name[]="siva"; printf("%s\n",name); printf("%c\n",*name); } 为什么我们需要使用指针来显示字符%c,而字符串不需要指针 我使用时出错 printf("%c\n", name); 我犯的错误是
%c
和%s
感到困惑
#include <stdio.h>
void main()
{
char name[]="siva";
printf("%s\n",name);
printf("%c\n",*name);
}
为什么我们需要使用指针来显示字符%c,而字符串不需要指针
我使用时出错
printf("%c\n", name);
我犯的错误是
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
数组的名称是其第一个元素的地址,因此
name
是指向包含字符串“siva”的内存的指针
此外,不需要指针来显示字符;在本例中,您只是选择直接从阵列中使用它。您可以这样做:
char c = *name;
printf("%c\n", c);
您将解引用运算符*与指针类型注释*混淆。 基本上,C*表示不同地方的不同事物:
- 在类型中,*表示指针。int是整数类型,int*是指向整数类型的指针
- 作为前缀运算符,*表示“取消引用”。name是指针,*name是取消引用它的结果(即获取指针指向的值)
- 当然,作为中缀运算符,*表示“乘法”
printf("%c\n",*name++);
将打印
i
等等
%s不需要指针,因为它可以直接处理字符串。如果您尝试此操作:
#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]);
}
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}
所以“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
要打印字符,需要将字符的值传递给printf。该值可以作为名称[0]或*name引用(因为对于数组名称=&name[0])
要打印字符串,需要将指向字符串的指针传递给printf(在本例中为“name”或“&name[0]”)。如果要显示单个字符,还可以使用
name[0]
而不是使用指针
它可以满足您的需要,但如果您想使用%c
显示完整字符串,您可以尝试以下方法:
#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]);
}
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}
#包括
void main()
{
字符名称[]=“湿婆”;
int i;
对于(i=0;i问题是printf函数需要一个指针作为参数。然而,char是一个可以直接访问的变量。字符串是字符串第一个字符上的指针,因此不必添加*因为*是变量指针的标识符。更重要的是*name
取消了指针的限制(即返回指针指向的对象)*
对于指针来说,总是意味着同样的事情。你只是想得太多了(这是智能的标志)。这样看,int*myintptr;
表示指针myintptr
引用的地址将存储一个int
,而*myintptr=5;
表示指针myintptr
引用的地址应包含一个5。*
始终表示“处的值”。欢迎来到StackOverflow!这个问题已经有好几年了,有很多解释得很好的详细答案。目前,你的答案并没有比这些其他答案添加更多内容。如果你能够提供更多细节并为问题添加一些新方面,请编辑你的帖子并将其包括在内。如果你不能,请不要担心!这个网站上还有很多其他问题,请删除这个答案,然后尝试解决一些更新的问题。回答愉快!
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}