web-dev-qa-db-fra.com

Comment imprimer un tableau de caractères en C via printf?

Il en résulte un défaut de segmentation. Qu'est-ce qui doit être corrigé?

int main(void)
{
    char a_static = {'q', 'w', 'e', 'r'};
    char b_static = {'a', 's', 'd', 'f'};

    printf("\n value of a_static: %s", a_static);
    printf("\n value of b_static: %s\n", b_static);
}
6
Aquarius_Girl

Le code affiché est incorrect: a_static et b_static doit être défini comme un tableau.

Il existe deux façons de corriger le code:

  • vous pouvez ajouter des terminateurs nuls pour faire de ces tableaux des chaînes C appropriées:

    #include <stdio.h>
    
    int main(void) {
        char a_static[] = { 'q', 'w', 'e', 'r', '\0' };
        char b_static[] = { 'a', 's', 'd', 'f', '\0' };
    
        printf("value of a_static: %s\n", a_static);
        printf("value of b_static: %s\n", b_static);
        return 0;
    }
    
  • Alternativement, printf peut imprimer le contenu d'un tableau qui n'est pas terminé par null en utilisant le champ de précision:

    #include <stdio.h>
    
    int main(void) {
        char a_static[] = { 'q', 'w', 'e', 'r' };
        char b_static[] = { 'a', 's', 'd', 'f' };
    
        printf("value of a_static: %.4s\n", a_static);
        printf("value of b_static: %.*s\n", (int)sizeof(b_static), b_static);
        return 0;
    }
    

    La précision donnée après le . spécifie le nombre maximum de caractères à sortir de la chaîne. Il peut être donné sous forme de nombre décimal ou de * et fourni sous la forme d'un argument int avant le pointeur char.

Cela entraîne un défaut de segmentation.? en raison de l'instruction ci-dessous

char a_static = {'q', 'w', 'e', 'r'};

a_static devrait être char array pour contenir plusieurs caractères. faire comme

 char a_static[] = {'q', 'w', 'e', 'r','\0'}; /* add null terminator at end of array */

De même pour b_static

char b_static[] = {'a', 's', 'd', 'f','\0'};
1
Achal

Vous devez utiliser un tableau au lieu de déclarer

a_static
b_static

comme variables

Cela ressemble donc à ceci:

int main()
{
  char a_static[] = {'q', 'w', 'e', 'r','\0'};
  char b_static[] = {'a', 's', 'd', 'f','\0'};
  printf("a_static=%s,b_static=%s",a_static,b_static);
  return 0;
}
0
Karthik Vg

Le fait est que vous utilisez des chaînes de style C, et une chaîne de style C se termine par un zéro. Par exemple, si vous souhaitez imprimer "alien" en utilisant un tableau char:

char mystring[6] = { 'a' , 'l', 'i', 'e' , 'n', 0}; //see the last zero? That is what you are missing (that's why C Style String are also named null terminated strings, because they need that zero)
printf("mystring is \"%s\"",mystring);

La sortie doit être:

mystring est "étranger"

De retour à votre code, il devrait ressembler à:

int main(void) 
{
  char a_static[5] = {'q', 'w', 'e', 'r', 0};
  char b_static[5] = {'a', 's', 'd', 'f', 0}; 
  printf("\n value of a_static: %s", a_static); 
  printf("\n value of b_static: %s\n", b_static); 
  return 0;//return 0 means the program executed correctly
}

Soit dit en passant, au lieu de tableaux, vous pouvez utiliser des pointeurs (si vous n'avez pas besoin de modifier la chaîne):

char *string = "my string"; //note: "my string" is a string literal

Vous pouvez également initialiser vos tableaux de caractères avec des littéraux de chaîne également:

char mystring[6] = "alien"; //the zero is put by the compiler at the end 

Aussi: Les fonctions qui opèrent sur les chaînes de style C (par exemple printf, sscanf, strcmp, strcpy, etc.) ont besoin de zéro pour savoir où se termine la chaîne

J'espère que vous avez appris quelque chose de cette réponse.

0
NotMe