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);
}
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'};
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;
}
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.