IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

String truncated


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut String truncated
    Bonjour a tous !
    Voila mon probleme :

    Je lis au clavier une chaine qui est longue d'au plus 80 caracteres; ensuite je lis au clavier un caractere.
    Le probleme est que ma chaine de caracteres est ensuite tronquee... allez savoir pourquoi ! J'ai passe toute l'heure de cours sur cette erreur mais je n'ai pas trouve la solution.
    Un petit detail : pour lire un caractere je devrais utiliser getchar() mais j'utilise fgets(chaine, 2, stdin) pour avoir le caractere et ensuite je met \0 a l'indice 1; ex :
    char chaine[2]; fgets(chaine, 2, stdin); chaine[1] = '\0';
    ca a l'air un peu bete mais c'est pcq le programme utilise une base de donees et que je dois copier le caractere dans une variable de type CS_CHAR
    Bref, ce n'est pas un probleme avec la DB, c'est juste un probleme avec cette chaine tronquee.
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    void ajouterRecette () {
    	char * description;
    	char * type;
    	exec sql begin declare section;
    		CS_CHAR sqlDescription[80];
    		CS_CHAR sqlType[2];
    		CS_SMALLINT nb;
    	exec sql end declare section;
     
    	description = lireDescription();
    	if (description == NULL) return;
    	type = lireType();
    	if (type == NULL) return;
    	strcpy(sqlDescription, description);
    	strcpy(sqlType, type);
    exec sql INSERT INTO Recette VALUES (:sqlDescription, :sqlType);
    	exec sql commit;
    }
     
    char * lireDescription () {
    	char description[80];
     
    	printf("Description de la recette : ");
    	if (fgets(description, 80, stdin) == NULL) {
    		printf("Erreur lors de la lecture de la description\n");
    		return NULL;
    	}
    	fflush(stdin);
    	return description;
    }
     
    char * lireType () {
    	char type[2];
     
    	printf("Type de la recette ('e', 'p', 'd') : ");
    	if (fgets(type, 2, stdin) == NULL) {
    		printf("Erreur lors de la lecture du type\n");
    		return NULL;
    	}
    	fflush(stdin);
    	type[0] = toupper(type[0]);
    	if (type[0] != 'E' && type[0] != 'P' && type[0] != 'D') {
    		printf("Erreur : type de recette invalide\n");
    		return NULL;
    	}
    	type[1] = '\0';
    	return type;
    }
    le fflush(stdin) est place pour eviter des erreurs du style : si on lis une chaine au clavier, la seconde lecture ne se fait pas, ou plutot elle se deroule comme si qq chose avait ete tapee... bizarre

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: String truncated
    Citation Envoyé par mrttlemonde
    Voila mon probleme :

    Je lis au clavier une chaine qui est longue d'au plus 80 caracteres; ensuite je lis au clavier un caractere.
    Le probleme est que ma chaine de caracteres est ensuite tronquee... allez savoir pourquoi ! J'ai passe toute l'heure de cours sur cette erreur mais je n'ai pas trouve la solution.
    Un petit detail : pour lire un caractere je devrais utiliser getchar()
    Non.
    mais j'utilise fgets(chaine, 2, stdin) pour avoir le caractere et ensuite je met \0 a l'indice 1; ex :
    Insuffisant. Et le '\n', tu le mets où ? Comme il n'est pas lu, l'appel suivant ne s'arrête pas. Il faut un minimum de 3 char pour qu'un fgets() prenne correctement 1 caractères :

    {'a', '\n', 0}

    Tout est là :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Pose des questions si tu ne comprends pas.

    Citation Envoyé par mrttlemonde
    le fflush(stdin) est place pour eviter des erreurs du style : si on lis une chaine au clavier, la seconde lecture ne se fait pas, ou plutot elle se deroule comme si qq chose avait ete tapee... bizarre
    Si on utilise correctement les fonctions de saisies, on a pas besoin de cette bidouille infâme, non standard, voire dangereuse...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut Ah !
    J'ai trouve une erreur effectivement... je declare :

    char description[80] dans la fonctione lireDescription() puis je renvoie la description. C'est pas possible ca... j'ai change ca par lireDescription(char * description) et ca fonctionne... il reste quand meme un caractere indesirable a la fin de la chaine. Je ne comprend pas pourquoi ...

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Ah !
    Citation Envoyé par mrttlemonde
    J'ai trouve une erreur effectivement... je declare :

    char description[80] dans la fonctione lireDescription() puis je renvoie la description. C'est pas possible ca...
    Effectivement, c'est un gros bug velu
    j'ai change ca par lireDescription(char * description) et ca fonctionne... il reste quand meme un caractere indesirable a la fin de la chaine. Je ne comprend pas pourquoi ...
    Ca fout la trouille!

    Tu peux montrer le code exact ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 47
    Points
    47
    Par défaut Oki !
    Tout d'abord je voudrais te remercier pour tes reponses. Ca doit pas etre tres amusant de repondre a ce genre de probleme, je l'avoue :-)

    Voici le code final de la methode lireDescription()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char * lireDescription (char * description) {
     
    	printf("Description de la recette : ");
    	if (fgets(description, 80, stdin) == NULL) {
    		printf("Erreur lors de la lecture de la description\n");
    		return NULL;
    	}
    	return description;
    }
    Bon je devrais tester aussi si il n'a pas entre une chaine vide ou fin de fichier mais bon... c'est le plus basique pour le moment vu que ce n'est pas le seul probleme lol[/code]

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Oki !
    Citation Envoyé par mrttlemonde
    Voici le code final de la methode lireDescription()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char * lireDescription (char * description) {
     
    	printf("Description de la recette : ");
    	if (fgets(description, 80, stdin) == NULL) {
    		printf("Erreur lors de la lecture de la description\n");
    		return NULL;
    	}
    	return description;
    }
    Ce code est correct, mais améliorable.

    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/11/2010, 13h04
  2. String Truncation dans Procédure
    Par JP.NUAGE dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2008, 17h54
  3. [Error] String or binary data would be truncated.
    Par n00bi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/08/2006, 16h57
  4. String or binary data would be truncated
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/05/2006, 20h40
  5. TRIGGERS - String truncation ou numeric overflow
    Par AlBoLeToNo dans le forum InterBase
    Réponses: 5
    Dernier message: 21/09/2004, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo