2017-09-26 3 views
4

La fonction printf() utilise le spécificateur de format %s pour imprimer char *. La norme ne spécifie pas comment char est implémenté comme signé ou non signé.Impression du type de données char avec printf()

Ainsi, lorsque char est mis en œuvre comme signé char, et nous utilisons %s pour imprimer unsigned char *, est-il sûr de le faire?

Quel spécificateur de format devrions-nous utiliser dans ce cas?

+0

Les pointeurs n'ont pas de signes, et la cible du pointeur n'est pas manipulée arithmétiquement, donc cela n'a pas d'importance. –

+0

@MartinJames Ne sait pas comment le [commentaire] (https://stackoverflow.com/questions/46426473/printing-data-type-char-with-printf/46427667#comment79809984_46426473) s'applique ici. Cela reflète peut-être une version antérieure de la question? – chux

Répondre

6

... quand char est mis en œuvre dans signed char, et nous utilisons "%s" pour imprimer unsigned char*. Est-il sûr de le faire?

Oui c'est sûr.

char *cp = ...; 
signed char *scp = ...; 
unsigned char *ucp = ...; 
printf("%s", cp); // OK. 
printf("%s", scp); // OK. 
printf("%s", ucp); // OK. 

(% s) ... l'argument est un pointeur vers l'élément initial d'une matrice de type de caractère. ... C11dr §7.21.6.1 8

Les trois types char, signed char et unsigned char sont collectivement appelés les types de caractères. C11 §6.2.5 15

+0

Merci! J'ai lu la norme, et vois le type de caractère de% s besoin, mais je n'ai pas obtenu quel type de caractère est. Je devrais lire la norme plus attentivement. – user8174916

-1

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

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.