web-dev-qa-db-fra.com

Un pointeur sur une chaîne peut-il être utilisé dans un printf?

Je pense à quelque chose comme:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void) {
    //test pointer to string
    char s[50];
    char *ptr=s;
    printf("\nEnter string (s): ");
    fgets(s, 50, stdin);
    printf("S: %s\nPTR: %s\n", s, *ptr);

    system("PAUSE");
    return 0;
}

Ou devrais-je utiliser une boucle for avec * (s + i) et le spécificateur de format% c? Est-ce le seul moyen possible d'imprimer une chaîne à l'aide d'un pointeur et d'une simple printf?

Mise à jour: le printf fonctionne avec l'adresse du premier élément du tableau. Ainsi, lorsque j'utilise * ptr, je travaille avec le premier élément et non avec son adresse. Merci.

18
andreihondrari

Le spécificateur de format "%s" pour printftoujours attend un argument char*.

Donné:

char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);

cela donne semble que vous passez un tableau pour le premier %s et un pointeur pour le second, mais en fait, vous passez (correctement) des pointeurs pour les deux.

En C, toute expression de type tableau est implicitement convertie en un pointeur sur le premier élément du tableau sauf si il se trouve dans l'un des trois contextes suivants:

  • C'est un argument à l'opérateur unaire "&" (adresse-de)
  • C'est un argument pour l'opérateur unaire "sizeof"
  • C'est un littéral de chaîne dans un initialiseur utilisé pour initialiser un objet tableau.

(Je pense que C++ a une ou deux autres exceptions.)

L'implémentation de printf() voit le "%s", suppose que l'argument correspondant est un pointeur sur char et utilise ce pointeur pour parcourir la chaîne et l'imprimer.

La section 6 de la comp.lang.c FAQ a une excellente discussion à ce sujet.

33
Keith Thompson
printf("%s\n", ptr);

C'est ce que tu veux?

À propos, de printf(3) , voici la documentation pour le spécificateur de conversion s (i.e %s):

Si aucun modificateur l n'est présent: L'argument const char * est attendu à être un pointeur sur un tableau de type caractère (pointeur sur une chaîne) . Les caractères du tableau sont écrits jusqu'à (sans inclure) un se terminant octet nul ('\ 0'); si une précision est spécifiée, pas plus que le nombre spécifié sont écrits. Si une précision est donnée, non un octet nul doit être présent; si la précision n'est pas spécifiée ou est supérieure à la taille du tableau, le tableau doit contenir un se terminant octet nul.

7
Bertrand Marron

vous devriez faire "printf (" S:% s\nPTR:% s\n ", s, ptr); " au lieu de printf ("S:% s\nPTR:% s\n", s, * ptr);

la différence entre ptr et * ptr est: ptr vous donne le adresse dans la mémoire de la variable que vous pointez et * ptr donne plutôt le valeur de la variable pointée Dans ce cas, * ptr = ptr [0]

ce code montrera ce que je veux dire:

printf("\tS: %s\n\tPTR: %s\n\tAddress of the pointed Value: %x\n\tValue of the whole String: %s\n\tValue of the first character of the String: %c\n", s, ptr,ptr,ptr,*ptr);
1
arthur

D'après mon expérience, vous devriez avoir une erreur de segmentation lorsque vous essayez d'utiliser la directive% s avec * p.

0
MAIGA