web-dev-qa-db-fra.com

Cordes et personnage avec printf

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 *’
34
Aspire

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]').

59
Komal Padia
%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.

10
aleroot

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:

  • Dans un type, * signifie un pointeur. int est un type entier, int * est un pointeur sur un type entier
  • En tant qu'opérateur préfixe, * signifie 'déréférence'. name est un pointeur, * name est le résultat de son déréférencement (c'est-à-dire l'obtention de la valeur pointée par le pointeur)
  • Bien entendu, en tant qu'opérateur infixe, * signifie «multiplie».
6
zeuxcg

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);
4
trojanfoe

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));
    }
} 
0
Chhavi