带 printf 的字符串和字符

我对以下 C 程序中 %c%s的用法感到困惑:

#include <stdio.h>
    

void main()
{
char name[] = "siva";
printf("%s\n", name);
printf("%c\n", *name);
}

产出:

siva
s

为什么我们需要使用指针来显示字符% 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 *’
681210 次浏览

数组的名称是其第一个元素的地址,因此 name 是一个指向包含字符串“ siva”的内存的指针。

此外,您不需要指针来显示字符; 在这种情况下,您只是选择直接从数组中使用它。你可以这样做:

char c = *name;
printf("%c\n", c);

你把解引用运算符 * 和指针类型注释 * 搞混了。 基本上,C * 在不同的地方表示不同的东西:

  • 在类型中,* 表示一个指针。 int 是一个整数类型,int * 是一个指向整数类型的指针
  • 作为前缀运算符,* 表示“解引用”。Name 是一个指针,* name 是解引用它的结果(即获取指针指向的值)
  • 当然,作为中缀操作符,* 的意思是“相乘”。
%c

是为单个字符设计的一个字符,所以它只打印一个元素。将字符数组作为指针传递给数组的第一个元素(即单个字符)的地址,然后将打印:

是的

printf("%c\n",*name++);

将打印

我坚强

诸如此类。

% 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]);
}

产出为:

name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s

所以“ 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。该值可以引用为 name[0]*name(因为对于数组 name = &name[0])。

要打印字符串,您需要将指向字符串的指针传递给 printf(在本例中为 name&name[0])。

如果要显示单个字符,也可以使用 name[0]而不是使用指针。

它将满足您的需要,但是如果您想使用 %c显示完整的字符串,您可以尝试这样做:

#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}

实际上 printf 函数需要一个指针作为参数。但是 char 是您可以直接访问的变量。字符串是指向字符串第一个字符的指针,所以不必添加 * ,因为 * 是变量指针的标识符。

或者你可以像下面的代码一样使用 %c:

#include <stdio.h>


void main()
{
char name[]="siva";
//prints as string form
printf("%s\n",name);
    

//print each letter on different line
int size= sizeof(name);
int i;
for(i=0;i<size;i++){
printf("%c\n",name[i]);
}
    

}