Des tableaux de Char et de la fonction scanf en C
Je m'attendais à obtenir des erreurs dans le code suivant, mais je n'ai pas. Je n'ai pas utilisé &
signe. Aussi, je suis d'édition de tableau de char
s.
#include <stdio.h>
int main()
{
char name[10] ="yasser";
printf("%s\n",name);
//there is no error ,
//trying to edit array of chars,
//also did not use & sign.
scanf("%s",name);
//did not use strcpy function also.
printf("%s\n",name);
return 0;
}
Ce code fonctionne correctement, Votre attente n'est pas. Quoi de plus à dire
Je sais que je suis mal,j'attends de déclaration.
stackoverflow.com/questions/4607128/...
Tout comme une note de côté,
Tableau ont une taille fixe, mais pas de contenu fixe. Cela signifie que vous pouvez en modifier le contenu, mais pas la taille, c'est la confusion que vous avez?.
Je sais que je suis mal,j'attends de déclaration.
stackoverflow.com/questions/4607128/...
Tout comme une note de côté,
&
signe est appelé adresse de l'opérateur &
.Tableau ont une taille fixe, mais pas de contenu fixe. Cela signifie que vous pouvez en modifier le contenu, mais pas la taille, c'est la confusion que vous avez?.
OriginalL'auteur BratBart | 2016-01-26
Vous devez vous connecter pour publier un commentaire.
C'est totalement ok comme
name
est déjà l'adresse du tableau de caractères.Presque, mais pas tout à fait droit.
name
n'est pas l'adresse du tableau de caractères.name
est le tableau de taille 10. Lorsquename
est passé àscanf()
, il est converti à l'adresse du premier élément du tableau.À codifier @SenselessCoder du commentaire, la suite sera toujours vrai: montableau == &(montableau[0])
Haha, nice @AaronBurke.
OriginalL'auteur artm
Lorsque vous passer des tableaux de fonctions en C, la décomposition de pointeurs vers le premier élément.
Donc pour:
scanf("%s", name)
est le même quescanf("%s", &name[0])
et l'une de ces invocations doivent envoyer un frisson dans le dos, parce que si vous contrôlez ce qui est sur votrestdin
(ce qui n'est généralement pas le cas), vous êtes en train de lire un très long chaîne de caractères dans la mémoire tampon, ce qui est une faute de segmentation en attente de se produire (ou pire, un comportement indéfini).scanf("%s", &name[0])
, mais pas le même quescanf("%s", &name)
. Ce dernier provoque un comportement indéterminé.OriginalL'auteur PSkocik
Il semble que vous avez plusieurs questions:
scanf("%s", name)
doit avoir donné une erreur, car%s
attend un pointeur etname
est un tableau? Mais comme d'autres l'ont expliqué, lorsque vous utilisez une matrice dans une expression comme cela, ce que vous obtenez toujours (automatiquement) est un pointeur vers le premier élément du tableau, comme si vous aviez écritscanf("%s", &name[0])
.scanf
écrire dansname
doit avoir donné une erreur, carname
a été initialisé avec une chaîne de caractères constante? Eh bien, c'est la façon dont il a été initialisé, maisname
est vraiment un tableau, de sorte que vous êtes libre d'écrire pour elle (tant que vous n'écrivez pas plus de 10 caractères, bien sûr). En voir plus sur ce ci-dessous.strcpy
? Pas de réelle surprise, là. Encore une fois,scanf
juste écrit dans votre tableau.Prenons un peu plus près ce que vous a écrit, et ce que vous n'avez pas écrit.
Lorsque vous déclarer et initialiser un tableau de
char
, c'est complètement différent que lorsque vous déclarer et initialiser un pointeur àchar
. Quand vous avez écritce que le compilateur a fait pour vous était un peu comme si vous aviez écrit
Qui est, le compilateur s'arrange pour initialiser le contenu du tableau avec les caractères de la chaîne constante, mais ce que vous obtenez est un ordinaire, inscriptible et tableau (pas un unwritable, chaîne constante constante).
Si, d'autre part, vous aviez écrit
vous aurait obtenu les problèmes que vous avez prévu. Dans ce cas,
namep
est un pointeur, pas un tableau. Il est initialisé à point pour la constante de chaîne"yasser"
, ce qui n'est pas accessible en écriture. Lorsquescanf
essayé à l'écriture de ce mémoire, vous auriez probablement eu une erreur.OriginalL'auteur Steve Summit