Probleme pour entrez un nom dans une variable
Fermé
Profil bloqué
-
28 juin 2009 à 22:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2009 à 08:37
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 30 juin 2009 à 08:37
A voir également:
- Probleme pour entrez un nom dans une variable
- Trouver un nom avec une adresse - Forum Réseaux sociaux
- Nom pour facebook stylé - Guide
- Trouver un numéro de téléphone ou un nom ? - Forum Loisirs / Divertissements
- Nom de l'adresse ✓ - Forum Réseaux sociaux
10 réponses
xmoix
Messages postés
36
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
29 juin 2009
2
28 juin 2009 à 22:44
28 juin 2009 à 22:44
t'a oublié les guillemets pour le mot girl, c'est une chaine de caractère !!!
xmoix
Messages postés
36
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
29 juin 2009
2
28 juin 2009 à 22:47
28 juin 2009 à 22:47
nan ! "girl" <<<<---- comme ca !!!
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { char mec[40], meuf[40], sex[40]; int sexe = 0; printf("your a man or a girl ?\n1:Girl \n2:Man\n"); scanf("%d",&sexe); printf("say your name please : "); if(sexe==1) { scanf("%s",&meuf); sex[40] = 'girl'; } else if(sexe==2) { scanf("%s",&mec); sex[40] = 'Man'; } else { printf("Your sexe is not available"); }; switch(sexe) { case 1: printf(" So your a %s and your name is %s ", sex, meuf); <--- l'erreur est la ! break; case 2: printf(" So your a %s and your name is %s ", sex, mec); <---et la ! break; }; printf("\n"); system("PAUSE"); return EXIT_SUCCESS; }
C'est mon code. a la fin au lieu de mettre girl ou man, il me met '' je comprends pas.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
moi sa marche avec
sex[40] = 'Man';
mais pas avec
sex[40] = "Man";
mais a la fin j'ai l'erreur que j'ai mis au dessus.
sex[40] = 'Man';
mais pas avec
sex[40] = "Man";
mais a la fin j'ai l'erreur que j'ai mis au dessus.
xmoix
Messages postés
36
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
29 juin 2009
2
28 juin 2009 à 22:52
28 juin 2009 à 22:52
heu... je t'ai dit de mettre "girl" et pas 'girl'
xmoix
Messages postés
36
Date d'inscription
vendredi 26 juin 2009
Statut
Membre
Dernière intervention
29 juin 2009
2
28 juin 2009 à 22:59
28 juin 2009 à 22:59
Bizarre, c koi ton IDE ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
28 juin 2009 à 23:12
28 juin 2009 à 23:12
Ca ne risque pas de marcher cette syntaxe.
char sex[40];
Autrement dit, un tableau de char.
Pour mettre une valeur dans ce tableau, tu dois utiliser strcpy ou strncpy
Ce qui donne : strncpy(sex,"girl",sizeof sex);
Si tu veux mettre girl dans sex à la position 41, il faut rajouter une dimension.
char sex[50][10];
strncpy(sex[40],"girl",sizeof sex);
Sachant qu'en C++, tu as la classe string.
string sex[50];
sex[40]="girl";
Plus simple non ? ^^
PS : n'oublie pas qu'en C/C++, les tableaux commencent à l'indice 0. Donc si tu fais char tab[40], le dernier élément est tab[39];
Cdlt
char sex[40];
Autrement dit, un tableau de char.
Pour mettre une valeur dans ce tableau, tu dois utiliser strcpy ou strncpy
Ce qui donne : strncpy(sex,"girl",sizeof sex);
Si tu veux mettre girl dans sex à la position 41, il faut rajouter une dimension.
char sex[50][10];
strncpy(sex[40],"girl",sizeof sex);
Sachant qu'en C++, tu as la classe string.
string sex[50];
sex[40]="girl";
Plus simple non ? ^^
PS : n'oublie pas qu'en C/C++, les tableaux commencent à l'indice 0. Donc si tu fais char tab[40], le dernier élément est tab[39];
Cdlt
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 juin 2009 à 06:22
29 juin 2009 à 06:22
Hello, je corrige une petite boulette que je viens de voir :
strncpy(sex[40],"girl",sizeof sex[40]); // ne pas oublier le [40] dans le sizeof.
strncpy(sex[40],"girl",sizeof sex[40]); // ne pas oublier le [40] dans le sizeof.
Nabla's
Messages postés
18203
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 193
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
29 juin 2009 à 09:57
29 juin 2009 à 09:57
a la place de sizeof sex[40], j'aurai plutot vu un strlen(sex)+1 !! pour ne copier que la partie utile, + le char de fin de chaine
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
Nabla's
Messages postés
18203
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
29 juin 2009 à 21:39
29 juin 2009 à 21:39
Et bien c'est un tort.
Si dans strlen est plus grand que sizeof sex[40], tu as un joli débordement.
Si tu mets strlen comme tu l'as dit, cela produira exactement le même comportement que strcpy qui s'arrêtera au premier \0 rencontré (autrement dit il copiera strlen(sex) +1).
Le mieux, c'est de mettre sizeof sex[40], comme ça tu ne te poses pas de questions, et tu es protégé des buffer overflows. De plus, il ne faut pas oublier de rajouter un '\0' à la position 'sizeof sex[40] - 1' car strncpy ne garantit pas la mise du \0 final si l'entrée est trop grande.
Et enfin, si tu veux de la performance (c'est-à-dire ne pas 'padder' par des '\0' pour avoir le nombre de caractères requis, il faut se créer sa fonction (comme strlcpy sur BSD).
Cdlt
Si dans strlen est plus grand que sizeof sex[40], tu as un joli débordement.
Si tu mets strlen comme tu l'as dit, cela produira exactement le même comportement que strcpy qui s'arrêtera au premier \0 rencontré (autrement dit il copiera strlen(sex) +1).
Le mieux, c'est de mettre sizeof sex[40], comme ça tu ne te poses pas de questions, et tu es protégé des buffer overflows. De plus, il ne faut pas oublier de rajouter un '\0' à la position 'sizeof sex[40] - 1' car strncpy ne garantit pas la mise du \0 final si l'entrée est trop grande.
Et enfin, si tu veux de la performance (c'est-à-dire ne pas 'padder' par des '\0' pour avoir le nombre de caractères requis, il faut se créer sa fonction (comme strlcpy sur BSD).
Cdlt
Nabla's
Messages postés
18203
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 193
29 juin 2009 à 10:08
29 juin 2009 à 10:08
je vais revenir un peu sur
if(sexe==1)
{
scanf("%s",&meuf);
sex[40] = 'girl';
}
ce que tu fais ici (sex[40] = 'girl';), mis a part les guillemets qui sont faux (on est pas en php!!)
tu as une chaine de charactères sex qui fait 40 de long. Elle est donc numéroté de 0 à 39. Donc déja, tu n'as strictement pas le droit d'utiliser la case 40!!!! (et meme si tu as l'impression que ca fonctionne, tu fais un bufer ovberflow, c'est dangereux!!!!
de plus, tu ne dois pas utiliser sex[40] qui est un caractère, mais sex qui est une chaine de caractères (girl c'est 4 caractères + 1 char de fin de chaine)...
de plus, si tu fais sex="girl", ca semblera marcher, mais ut aura redirigé le pointeur: au lieu d'avoir une variable de 40 de long comme tu as déclaré plus haut, tu pointera sur la constante "girl", qui fait 4+1 charactères de long, et qui n'est pas modifiable. C'est pour ca qu'il faut a tout prix éviter (surtout lorsque tu débute la programmation) de faire des = avec des chaines de caractèrs. Ton compilateur ne te dis pas forcement qu'il y a un problème, car "girl" est un pointeur (sur 4 octets), donc tu veux mettre 4 octets dans un seul octet, au pire il va te dire que tu vas perdre quelques données... et tu aura un truc incopréhensible...
if(sexe==1)
{
scanf("%s",&meuf);
sex[40] = 'girl';
}
ce que tu fais ici (sex[40] = 'girl';), mis a part les guillemets qui sont faux (on est pas en php!!)
tu as une chaine de charactères sex qui fait 40 de long. Elle est donc numéroté de 0 à 39. Donc déja, tu n'as strictement pas le droit d'utiliser la case 40!!!! (et meme si tu as l'impression que ca fonctionne, tu fais un bufer ovberflow, c'est dangereux!!!!
de plus, tu ne dois pas utiliser sex[40] qui est un caractère, mais sex qui est une chaine de caractères (girl c'est 4 caractères + 1 char de fin de chaine)...
de plus, si tu fais sex="girl", ca semblera marcher, mais ut aura redirigé le pointeur: au lieu d'avoir une variable de 40 de long comme tu as déclaré plus haut, tu pointera sur la constante "girl", qui fait 4+1 charactères de long, et qui n'est pas modifiable. C'est pour ca qu'il faut a tout prix éviter (surtout lorsque tu débute la programmation) de faire des = avec des chaines de caractèrs. Ton compilateur ne te dis pas forcement qu'il y a un problème, car "girl" est un pointeur (sur 4 octets), donc tu veux mettre 4 octets dans un seul octet, au pire il va te dire que tu vas perdre quelques données... et tu aura un truc incopréhensible...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 juin 2009 à 21:50
29 juin 2009 à 21:50
de plus, si tu fais sex="girl", ca semblera marcher, mais ut aura redirigé le pointeur:
Attention, tu confonds pointeur et tableau.
sex="girl" marche parfaitement si sex est un pointeur. Mais ici sex est un tableau de char, et ça ne marchera pas puisque tu changes l'adresse du premier élément du tableau.
Attention, tu confonds pointeur et tableau.
sex="girl" marche parfaitement si sex est un pointeur. Mais ici sex est un tableau de char, et ça ne marchera pas puisque tu changes l'adresse du premier élément du tableau.
Nabla's
Messages postés
18203
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 193
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
30 juin 2009 à 08:09
30 juin 2009 à 08:09
a vérifier, mais un tableau et un pointeur, en C, c'est pareil....
et si tu as fait char * sex="girl", alors ca ne plantera pas a ce moment la, mais si deriere tu essayes de faire "strcpy(sex,"test_copie"), ca devrait planter....
bon, on retiendra qu'il ne faut pas utiliser le = avec les chaines de caractères
et si tu as fait char * sex="girl", alors ca ne plantera pas a ce moment la, mais si deriere tu essayes de faire "strcpy(sex,"test_copie"), ca devrait planter....
bon, on retiendra qu'il ne faut pas utiliser le = avec les chaines de caractères
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
Nabla's
Messages postés
18203
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
30 juin 2009 à 08:37
30 juin 2009 à 08:37
Non un pointeur et un tableau ça na strictement rien a voir. Il y a des points communs certes, mais c'est tout.
Un sizeof d'un pointeur te retournera la taille d'une adresse mémoire tandis que le sizeof d'un tableau te donnera le nombre d'élément fois la taille d'une case.
De plus l'opérateur = avec un pointeur est parfaitement bon puisquon rattache les adresses. Pour un tableau de char par contre on utilise bien strncpy sauf a la declaration.
Note que je ne parle pas de pointeur sur une zone allouée dans le heap.
Un sizeof d'un pointeur te retournera la taille d'une adresse mémoire tandis que le sizeof d'un tableau te donnera le nombre d'élément fois la taille d'une case.
De plus l'opérateur = avec un pointeur est parfaitement bon puisquon rattache les adresses. Pour un tableau de char par contre on utilise bien strncpy sauf a la declaration.
Note que je ne parle pas de pointeur sur une zone allouée dans le heap.