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 :

La fonction strcspn() renvois un resultat erroné


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 417
    Par défaut La fonction strcspn() renvois un resultat erroné
    Salut à tous,
    voilà mon problème, j'ai le code suivant :
    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
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char Chaine[100],Chaine2[1];
    unsigned char i;
     
    void main()
    {
    	printf("Veuillez saisir la chaine a traiter : ");
    	gets(Chaine);
     
    	printf("Veuillez saisir le caractere a eliminer : ");
    	gets(Chaine2);
     
    	do
    	{
    		for(i=strcspn(Chaine, Chaine2); i<strlen(Chaine); i++)
    		{
    			Chaine[i]=Chaine[i+1];
    		}
    		Chaine[strlen(Chaine)+1]='\0';
     
    		i=strcspn(Chaine, Chaine2);
    	}
    	while(strcspn(Chaine, Chaine2)!=0);
     
    	printf("%s\n", Chaine);
    }
    et lorsque je met "sallut" dans Chaine et "l" dans Chaine2, lors de le deuxième passe de la boucle do...while, la fonction strcspn(Chaine, Chaine2) me renvois 4 alors que Chaine="saut" et Chaine2="l". Il n'y a donc plus d'occurence de Chaine2 dans Chaine. Mais alors pourquoi strcspn(Chaine, Chaine2) renvois 4? surtout que Chaine[4]=0 (NULL).
    Si quelqu'un a une solution, il est le bienvenue

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Kronoob
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char Chaine[100],Chaine2[1];
    Sans aller plus loin, il te faut réserver au moins 2 caractères pour Chaine2 (le caractère que tu veux lire + le 0 final).

    Le bon réflexe est de vérifier ton programme, pas d'accuser, a priori, ton compilateur et/ou les librairies fournies avec.

    Avant de suspecter un bug du compilateur et/ou des fonctions standards, il est necessaire d'avoir un programme irréprochable.

  3. #3
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 417
    Par défaut
    Mouarf
    ca resout rien ton truc. je peut meme metre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Chaine[100],Chaine2[100];
    mon problème n'est pas réglé et la boucle do...while ne se termine jamais alors que Chaine ne contient plus d'occurence de Chaine2

    C'était bien proposé mais ca marche pas

    =============
    Un collègue a trouvé comment contourner le problème, dans le test du while, je n'utilise plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strcspn(Chaine, Chaine2)!=0);
    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strstr(Chaine, Chaine2)!=0);
    ce qui reviens quasiment au meme, l'erreur en moins.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. N'utilise pas de variable globales à tort et à travers, surtout ici où ça ne sert absolument à rien.
    2. Jamais, au grand JAMAIS, n'utilise gets().
      fgets() est ton amie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 417
    Par défaut
    Citation Envoyé par Médinoc
    1. N'utilise pas de variable globales à tort et à travers, surtout ici où ça ne sert absolument à rien.
    2. Jamais, au grand JAMAIS, n'utilise gets().
      fgets() est ton amie.
    Tu as surement raison, pour le moment je suits des cours pour apprendre le C et mon prof nous a dit de déclarer les variables en globale, car nous ne recherchons pas l'optimisation. Quant à gets() ou fgets(), déjà mon prof ne se sert que de scanf() qui est d'après certains ici complètement pourri. Moi je prends gets() parce qu'avec je peu gerer les espaces, maintenant tu me parle de fgets() qui est mieux que gets() et demain ce sera un autre qui me parlera d'une autre fonction encore différente et sois disante meilleur. Je ne suis pas developpeur mais electronicien donc pour le moment je me contente de gets(). Le jour où mon programme ne marchera pas a cause de cette fonction, j'en prendrais une autre...
    Citation Envoyé par thewho
    Bonjour,
    Citation:
    Kronoob a écrit :
    ca resout rien ton truc. je peut meme metre
    Ai-je dit quelque part que c'était la solution ?

    Je t'ai seulement signalé un bug qui saute aux yeux, tant il est classique.
    Excuse, je me rends compte que je n'ai pas été correct vis à vis de ta réponse, j'en suis désolé, j'étais un peu sur les nerf à ce moment là.
    Par contre dans ton premier message tu insinue que j'accuse le compilateur d'etre fautif, ce qui n'est pas le cas. Je sais bien que l'erreur était dans mon code, mais je ne la voyais pas. Je suis electronicien, je sais donc qu'un ordinateur ne fait que ce qu'on lui demande et rien d'autre. Je me rends bien compte que je lui avait pas demandé ce à quoi je m'attendais.

    Citation Envoyé par zooro
    Les deux fonctions sont totalement différentes...
    Tu as raison, mais elle me permet de résoudre mon problème. C'est l'essentiel pour moi.
    Par contre pourrais-tu me dire où tu as trouvé ces definitions, car google a beau etre mon amis, je n'ai pas trouvé de définition de fonction aussi détaillée et clair.
    Merci d'avance.

    Citation Envoyé par Delahaye
    Go to frell !
    C'est quoi frell?

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Kronoob
    Tu as surement raison, pour le moment je suits des cours pour apprendre le C et mon prof nous a dit de déclarer les variables en globale, car nous ne recherchons pas l'optimisation.
    Ce n'est pas de ta faute, mais c'est une très mauvaise idée, les variables globales, et ça n'a rien à voir avec une quelconque optimisation. Il s'agit simplement de programmer proprement.

    C'est encore plus grave quand on apprend, car c'est en grande partie à ce moment là qu'on acquiert les habitudes, quelles soient bonnes ou mauvaises, et l'utilisation de variables globales fait partie des très mauvaises habitudes, cause de nombreux bugs, sans parler de l'écriture de code non directement réutilisable.

  7. #7
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Kronoob
    Par contre pourrais-tu me dire où tu as trouvé ces definitions, car google a beau etre mon amis, je n'ai pas trouvé de définition de fonction aussi détaillée et clair.
    Merci d'avance.
    Dans les pages man. Par exemple ici : http://man.developpez.com/

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Kronoob
    Tu as surement raison, pour le moment je suits des cours pour apprendre le C et mon prof nous a dit de déclarer les variables en globale, car nous ne recherchons pas l'optimisation.
    Bulls**t.
    Utiliser des variables globales ressemble plus à une absse optimisation en vitesse par des adeptes de l'assembleur qu'à autre chose...
    Utiliser des variables locales n'est absolument pas une optimisation, c'est une façon plus sûre de programmer (principe du moindre privilège).
    Quant à gets() ou fgets(), déjà mon prof ne se sert que de scanf() qui est d'après certains ici complètement pourri.
    Pas exactement, mais scanf() n'est pas une fonction pour débutants. En fait, le deux pires manières d'utiliser scanf() sont :
    • L'enseigner (mal) à des débutants
    • scanf("%s"), pour les mêmes raison que gets().

    Moi je prends gets() parce qu'avec je peu gerer les espaces, maintenant tu me parle de fgets() qui est mieux que gets() et demain ce sera un autre qui me parlera d'une autre fonction encore différente et sois disante meilleur. Je ne suis pas developpeur mais electronicien donc pour le moment je me contente de gets(). Le jour où mon programme ne marchera pas a cause de cette fonction, j'en prendrais une autre...
    Erreur. gets() est une fonction à ne JAMAIS utiliser, gets() est un BUG. Cette fonction n'aurait jamais dû faire partie de la norme, car il n'existe AUCUN moyen de bien l'utiliser (contrairement à scanf()). Donc, soit tu apprends à bien utiliser scanf() avec ce tutoriel, soit tu utilises fgets() au lieu de gets(). Point.
    C'est quoi frell?
    Dans l'esprit d'Emmanuel, aucune idée. Mais dans l'univers de Farscape, ça signifie plus ou moins "merde"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kronoob
    <...>pour le moment je suits des cours pour apprendre le C et mon prof nous a dit de déclarer les variables en globale, car nous ne recherchons pas l'optimisation.
    C'est ton prof qui est buggé. Essaye de télécharger une version plus récente...
    Quant à gets() ou fgets(), déjà mon prof ne se sert que de scanf() qui est d'après certains ici complètement pourri.
    gets() est pourri. scanf() est simplement difficile à utiliser de façon fiable et stable. Beaucoup de professionnels l'évite. Pour te donner une idée :

    http://xrenault.developpez.com/tutoriels/c/scanf/
    Moi je prends gets() parce qu'avec je peu gerer les espaces, maintenant tu me parle de fgets() qui est mieux que gets() et demain ce sera un autre qui me parlera d'une autre fonction encore différente et sois disante meilleur.
    Si tu ne nous fait pas confiance, qu'est-ce que tu viens chercher ici ? Fait tes fonctions de saisie toi même et débrouille toi.

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

    Si à chaque fois qu'on cherche à t'aider tu le prends de haut, on ne peut rien pour toi...

    Je ne suis pas developpeur mais electronicien
    Et alors ? C'est pas une tare. Moi aussi je suis électronicien. Ca ne m'empêche pas à chercher, depuis le premier jour où j'ai écris du code, à le faire correctement. Tu ne fais pas pareil en VHDL ?
    donc pour le moment je me contente de gets(). Le jour où mon programme ne marchera pas a cause de cette fonction, j'en prendrais une autre...
    Comme tu veux, mais autant prendre les bonnes habitudes maintenant et surtout éviter d'envoyer bouler les pros. Tu te prends pour qui là ?
    Par contre pourrais-tu me dire où tu as trouvé ces definitions, car google a beau etre mon amis, je n'ai pas trouvé de définition de fonction aussi détaillée et clair.
    Faut pas chercher très loin...

    http://man.developpez.com/

    C'est quoi frell?
    Farscape addict... Google's ya friend bro'.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Kronoob
    Par contre dans ton premier message tu insinue que j'accuse le compilateur d'etre fautif, ce qui n'est pas le cas. Je sais bien que l'erreur était dans mon code, mais je ne la voyais pas.
    Sans doute, mais relis le titre de ton sujet :

    La fonction strcspn() renvois un resultat erroné

    j'appelle ça accuser le compilateur, ou la librairie livrée avec.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Kronoob
    ca resout rien ton truc. je peut meme metre
    Ai-je dit quelque part que c'était la solution ?

    Je t'ai seulement signalé un bug qui saute aux yeux, tant il est classique.

  12. #12
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par Kronoob
    dans le test du while, je n'utilise plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strcspn(Chaine, Chaine2)!=0);
    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strstr(Chaine, Chaine2)!=0);
    ce qui reviens quasiment au meme, l'erreur en moins.
    Citation Envoyé par man
    SYNOPSIS
    #include <string.h>
    size_t strspn (const char *s, const char *accept);
    size_t strcspn (const char *s, const char *reject);

    DESCRIPTION
    La fonction strspn() calcule la longueur du segment initial de s qui ne contient que des caractères présents dans accept.
    La fonction strcspn() calcule la longueur du segment initial de s qui ne contient que des caractères absents de reject.
    VALEUR RENVOYÉE
    La fonction strspn() renvoie le nombre de caractères du segment initial de s constitué uniquement de caractères présents dans accept.
    La fonction strcspn() renvoie le nombre de caractères du segment initial de s constitué uniquement de caractères absents de reject.
    Citation Envoyé par man
    SYNOPSIS
    #include <string.h>
    char *strstr (const char *meule_de_foin, const char *aiguille);

    DESCRIPTION
    La fonction strstr() cherche la premiere occurence de la sous-chaîne aiguille au sein de la chaîne meule_de_foin. Les caractères `\0' de fin ne sont pas comparés.
    VALEUR RENVOYÉE
    La fonction strstr() renvoie un pointeur sur le début de la sous-chaîne, ou NULL si celle-ci n'est pas trouvée.
    Les deux fonctions sont totalement différentes...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Kronoob
    Mouarf
    ca resout rien ton truc. je peut meme metre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Chaine[100],Chaine2[100];
    mon problème n'est pas réglé et la boucle do...while ne se termine jamais alors que Chaine ne contient plus d'occurence de Chaine2

    C'était bien proposé mais ca marche pas
    Go to frell !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction qui renvoie mauvais resultat
    Par kate59 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/09/2011, 13h26
  2. renvoie une valeur erronée
    Par m@thieu dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2004, 17h09
  3. [bioinfo] fonction qui renvoie chaîne à autre fonction
    Par perlaud dans le forum Bioinformatique
    Réponses: 11
    Dernier message: 16/07/2004, 15h06
  4. procedures/fonctions stockees : renvoi de plusieurs parametr
    Par Spoutnik dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/05/2004, 11h53
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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