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 :

Trouver une chaîne dans une autre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Par défaut Trouver une chaîne dans une autre
    Bonjour !

    J'ai un petit soucis avec un exo que j'essaye de faire, je veux trouver dans un mot saisi par l'utilisateur si celui-ci comporte l'autre chaîne saisie par l'utilisateur, sans utiliser les fonctions toutes évidemment !

    Voilà ce que j'ai essayé de faire :

    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
     
     
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        char src[256] = {};
        char facteur[256] = {};
        int compteur = 0;
        int i=0;
        int j=0;
     
        printf("Saisir le premier mot: ");
        scanf("%s", &src);
        printf("Saisir le deuxiéme mot: ");
        scanf("%s", &facteur);
        int longueur = strlen(src);
        int longueurFacteur = strlen(facteur);
     
     
     
        for(i=0 ; i<longueur-longueurFacteur+1 ; i++){
            for(j=0 ; i<longueur-longueurFacteur+1; j++)
                if(facteur[i] == src[j]){
                    compteur++;
                    printf("%d \n", compteur);
     
                    printf("%d %d \n",j, i );
                }
                else
                    j=0;
     
     
                if(compteur == longueurFacteur){
                    printf("Le mot %s est bien un mot facteur de %s \n", facteur, src); 
                    return 1;
                }       
        }
     
        return 0;
    }
    voilà ce que j'obtient :


    root@Max:~/Bureau/C# gcc facteur.c

    root@Max:~/Bureau/C# ./a.out

    Saisir le premier mot: polyco

    Saisir le deuxiéme mot: poly

    1

    0 0
    J'ai essayé aussi avec une boucle while
    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
     
     
     
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        char src[256] = {};
        char facteur[256] = {};
        int compteur = 0;
        int i=0;
        int j=0;
     
        printf("Saisir le premier mot: ");
        scanf("%s", &src);
        printf("Saisir le deuxiéme mot: ");
        scanf("%s", &facteur);
        int longueur = strlen(src);
        int longueurFacteur = strlen(facteur);
     
     
     
        for(i=0 ; i<longueur-longueurFacteur+1 ; i++){
            while(i<longueur-longueurFacteur+1)
                if(facteur[i] == src[j]){
                    compteur++;
                    printf("%d \n", compteur);
                    j++;
                    printf("%d %d \n",j, i );
                }
                else
                    j=0;
     
     
                if(compteur == longueurFacteur){
                    printf("Le mot %s est bien un mot facteur de %s \n", facteur, src); 
                    return 1;
                }       
        }
     
        return 0;
    }
    Voilà ce que j'obtient : une boucle infinie

    Saisir le premier mot: polycop
    Saisir le deuxiéme mot: poly
    1
    1 0
    2
    1 0
    3
    1 0
    4
    1 0
    5
    1 0
    6
    1 0
    etc

    Ce qui est bizarre c'est que mon i ne s'incrémente pas et que il passe dans mon else alors qu'il est passé dans mon if avant ?? :/

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Médite :

    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
        const char* substr = /**/;
        unsigned short spos, spos1, dpos;
        unsigned char sc, sc1, dc;
        unsigned char substr_not_found = true;
     
        spos = 0;
        sc = str[spos];
     
        while(substr_not_found && (sc != '\0')) {
            if (((unsigned char) sc) == ((unsigned char) substr[0])) {
                dpos = 1;
     
                spos1 = (spos + 1);
                sc1 = str[spos1];
                dc = (unsigned char) substr[dpos];
     
                while ((sc1 != '\0') && (dc != '\0') && (sc1 == dc)) {
                    ++dpos;
                    ++spos1;
     
                    sc1 = str[spos1];
                    dc = (unsigned char) substr[dpos];
                }
     
                substr_not_found = (dc != '\0');
            }
     
            if (substr_not_found) { ++spos; sc = str[spos]; }
        }

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Par défaut re
    Malheureusement ça m'aide pas trop à voir ou j'ai merdé, et j'ai un peu du mal à comprendre le code avec ces noms de variables :/

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Donc tu veux du "clef en main"

    Si tu as une boucle infinie, c'est parce que tu as inversé le if et le while.

    Méditation (2): Parce que tu mets en premier le while qui dépend de i alors que ton if fait avancer j.


    Citation Envoyé par drakop Voir le message
    J'ai un peu du mal à comprendre le code avec ces noms de variables :/
    Je ne voulais pas mettre destination_char (dc) ou source_char (sc) ou encore source_substr_char (sc1)

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2016
    Messages : 109
    Par défaut re
    Non pas du tout mais c'est juste qu'avec ton code, j'étais pas plus avancé

    Mais merci je vais prendre en compte tes remarques et repasser après !

    Et également pourquoi mon programme passe dans le else alors qu'il est passé dans le if juste avant , ça non plus j'ai pas compris

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Je te trouve un peu dur foetus. Ceci dit c'est effectivement difficile de te dire ce qui ne va pas drakop sans corriger ton code. Je pense que tu as ici un souci d'algorithmique, pas d'implémentation.

    Ton problème correspond à la généralisation du problème suivant : comment déterminer si une chaîne A débute par une autre chaîne B, plus courte ? Vas-y par étapes, réalise déjà un programme qui résoud correctement cela. Tu n'as besoin que d'une seule boucle.

    Ensuite, et seulement ensuite, écris un autre programme qui détermine si B est contenue dans A, au début ou ailleurs.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Trouver la position d'une chaîne dans une chaîne
    Par taka10 dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 23h18
  5. Réponses: 4
    Dernier message: 11/08/2006, 13h47

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