J'ai été confondu avec l'utilisation de %c
et %s
dans le programme C suivant
#include<stdio.h>
void main()
{
char name[]="siva";
printf("%s\n",name);
printf("%c\n",*name);
}
La sortie est
siva
s
Pourquoi nous devons utiliser le pointeur pour afficher le caractère% c, et le pointeur n'est pas nécessaire pour une chaîne
Je reçois une erreur quand j'utilise
printf("%c\n", name);
Erreur que j'ai eu est
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
Si vous essayez ceci:
#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]);
}
La sortie est:
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
Donc, "nom" est en fait un pointeur sur le tableau de caractères en mémoire. Si vous essayez de lire les quatre premiers octets de 0xbff5391b, vous verrez 's', 'i', 'v' et '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
Pour imprimer un caractère, vous devez passer la valeur du caractère à printf. La valeur peut être référencée comme nom [0] ou * nom (puisque pour un nom de tableau = & nom [0]).
Pour imprimer une chaîne, vous devez passer un pointeur sur la chaîne à printf (dans ce cas, 'name' ou '& name [0]').
%c
est conçu pour un caractère, un caractère, de sorte qu'il n'imprime qu'un seul élément.Passez le tableau de caractères comme un pointeur, vous transmettez l'adresse du premier élément du tableau (c'est-à-dire un seul caractère) et sera ensuite imprimé:
s
printf("%c\n",*name++);
imprimera
je
etc ...
Le pointeur n'est pas nécessaire pour le% s car il peut fonctionner directement avec une chaîne de caractères.
Vous confondez l'opérateur de déréférence * avec l'annotation de type pointeur * . Fondamentalement, en C * signifie différentes choses à différents endroits:
Le nom d'un tableau est l'adresse de son premier élément. name
est un pointeur sur la mémoire contenant la chaîne "siva".
De plus, vous n'avez pas besoin d'un pointeur pour afficher un caractère; vous choisissez simplement de l'utiliser directement depuis le tableau dans ce cas. Vous pouvez le faire à la place:
char c = *name;
printf("%c\n", c);
Si vous souhaitez afficher un seul caractère, vous pouvez également utiliser name[0]
au lieu d'utiliser un pointeur.
Cela servira votre but, mais si vous voulez afficher la chaîne complète en utilisant %c
, vous pouvez essayer ceci:
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}