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
Bonjour,
j'ai un problème pour entrez un nom dans une variable en programmation c.

voici mon code :

sex[40] = girl;


dev me dis qu'il y a une erreur.
Mais je ne la voie pas.
En sachant que j'ai déclaré ma variable et que la je suis dans un if.


Merci d'avance

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
t'a oublié les guillemets pour le mot girl, c'est une chaine de caractère !!!
0
Profil bloqué
28 juin 2009 à 22:45
sex[40] ='girl';

comme ça ?
0
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
nan ! "girl" <<<<---- comme ca !!!
0
Profil bloqué
28 juin 2009 à 22:48
#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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Profil bloqué
28 juin 2009 à 22:52
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.
0
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
heu... je t'ai dit de mettre "girl" et pas 'girl'
0
Profil bloqué
28 juin 2009 à 22:54
oui mais "girl" marche pas alors que 'girl' marche
0
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
Bizarre, c koi ton IDE ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192 > 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
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > 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
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
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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.
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192 > 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
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > 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
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.
0