Confondu avec le char tableau lorsque le scanf
Je suis confondu avec un tout petit programme.
#include <stdio.h>
#define LEN 10
int main()
{
char str1[LEN] = "#include <stdio.h>
#define LEN 10
int main()
{
char str1[LEN] = "\0";
char str2[LEN] = "\0";
scanf("%s", str1);
scanf("%s", str2);
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
";
char str2[LEN] = "#include <stdio.h>
#define LEN 10
int main()
{
char str1[LEN] = "\0";
char str2[LEN] = "\0";
scanf("%s", str1);
scanf("%s", str2);
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
";
scanf("%s", str1);
scanf("%s", str2);
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
Si mon entrée sont:
mangobatao
mangobatao123456
Pourquoi la sortie:
123456
mangobatao123456
Et non pas:
mangobatao
mangobatao123456
Comment le char
tableau a été alloué dans la mémoire?
scanf("%s", str)
est dangereuse en soi, sauf si vous avez le contrôle complet sur ce qui va apparaître sur stdin. Cependant gros str
est, l'utilisateur peut taper plus de caractères que ne le fit en elle, ce qui provoque un comportement indéfini. (Comportement indéfini un plantage de votre programme si vous avez de la chance.)stackoverflow.com/questions/9291348/...
OriginalL'auteur user918304 | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
Bien, à 10 caractères
char
tableau ne correspondent pas à"mangobatao"
, depuis qu'il a 10 caractères - il n'y a pas de place pour le terminateur null. Cela signifie que vous avez causé à un comportement indéterminé, donc tout peut arriver.Dans ce cas, il ressemble à votre compilateur a jeté
str2
avantstr1
en mémoire, de sorte que lorsque vous appelezscanf
pour remplirstr2
, la plus longue chaîne écrase le début destr1
. C'est pourquoi vous voyez la fin de ce que vous pensez qu'il devrait être dansstr2
lorsque vous essayez d'imprimerstr1
. Votre exemple fonctionnera correctement si vous utilisez une longueur de 100.OriginalL'auteur Carl Norum
Je pense que votre compilateur a alloué un espace pour str2[10], à seulement 10 caractères avant le str1 pointeur.
Maintenant, lorsque vous scanf une chaîne de caractères de longueur de 16 à str2, le terminateur de chaîne '\0' est ajouté à str2 + 17ème position, qui est enfait str1 + 7.
Maintenant, lorsque vous appelez printf à str1, les caractères lus sont en fait ch2 + 11, ch2 + 12,..., ch2 + 16 jusqu'à ce que le terminateur null est rencontré à str2 + 17 (ou str1 + 7).
Le printf à str2 doit être évident.
OriginalL'auteur Aman Singh