Un truc tout bête et pourtant casse tête

Résolu
jeun's -  
 EL barto ! -
Bonjour,
alors là je sais que je suis au comble du ridicule MAIS ( !) j'ai pourtant besoin de vos conseil.

Je veux definir des constate de caractère, et les afficher.

je veux que char v avec v = 'bonjour"
et char u avec u = "au revoir"

et rechercher dans un texte les mots compris entre "bonjour" et au "revoir" voici ce que j'ai commencé à faire :

------------------------------------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
char v = 'bonjour';
char u = 'au revoir';
char i, p ; i correspond à l'ensemble du texte
p correspond au texte compris entre 'bonjour' et au 'revoir'

printf (" ecrivez un texte tel que :\n blablabla bonjour blablabla au revoir blablabla\n");
scanf ("%c", &i);


getchar();
return 0;

}
--------------------------------------------------------------------------------------------------------

alors est ce que j'aborde le problème de la bonne manière ?
est ce que je défini bien mes constantes ?

63 réponses

jeun's
 
tiens je te remet la partie 5

printf( "5\n" );
    
  i = 0;
  while ( i < strlen( chaine ) && !ok ) {
    printf( "Comparaison des chaines suivantes :\n'%s'\n'%s'\n\tTaille : %i\n", chaine[i], debut, taille );
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        ++i;
      }
    }
    ++i;
  }
0
jeun's
 
non, c'est bon, je viens de finir le paragrpahe sur le concatenage, ça n'a tout simplement rien à voir.
0
jeun's
 
Non a chaque fois .
0
jeun's
 
Bon, ben je sais que agaçant comme problème . mais on doit être fatigué.
et puis demain faut que j'aille bosser.

tu es là souvent sur le forum ? si demain soir je me reconnecte , tu sera là ?
là je n'arrive plus à rien faire.

si sa te dis ( je sais que c'est un etat d'esprit de ne rien laisser tomber), mais alterner les pauses ça fait parie d'une stratégie d"efficacité). ne t'acharne plus.

bonne soirée et à demain peut être .
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Je ne sais pas si je serai là demain, mais j'essaierai de réfléchir dessus... Par contre sans compiler/exécuter je vais avoir du mal... Mais t'as raison, une petite pause s'impose ^^. En verra plus tard ! Bonne nuit.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Bon, me revoilà ! Essaie ça et dis moi ce que ça affiche :
  i = 0;
  printf( "Longueur de chaine : %i", strlen( chaine ) );
  while ( i < strlen( chaine ) && !ok ) {
0

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

Posez votre question
john's
 
SAlut !!

ça indique le nombre de caractère aprés 4 et 5, puis la fenêtre window ( une erreure etc .. rapport d'erreure) ...
0
john's
 
Ca compte la totalité de la chaine de caractère.

y a un truc qui faut aussi que je te demande ( c'est à propos d'un autre sujet:

est ce que tu connais la commande "ping" qui permet d'avoir l'adresse IP d'un site ? est ce que tu saurais m'expliquer comment cette fonction arrive à si rapidement à trouver à partir de l'adresse internet (www.ect.com) l'adresse IP, se connecter , sans utiliser le navigateur ?

et pourquoi tu n'as pas de compilateur ? c'est gratuit !
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Pas envie d'installer un compilo sous windows, je ne développe en général que sous linux.

La commande ping ne trouve pas l'adresse IP d'un site toute seule, elle interroge un DNS (serveur de noms) qui fait l'association nom de domaine (ex: commentcamarche.net) -> adresse IP (ex: 213.248.125.112), exactement de la même façon que ton navigateur avant de t'afficher la page web demandée.

Est-ce que la longueur de la chaine est bonne ?
0
jeun's
 
Oui, elle l'est y'a pas un caratère de moins!

mais alors ping c'est moins une commande qu'un programme alors ? Est ce que tu sais où son code se trouve sur l'ordi ?
elle doit forcément être sur l'ordi très profondément caché puisque on ne peut l'utiliser qu'avec l'invite de commandes MSDOS .

Y aurait il une boucle non fermée par hasard ? Les accolades me crèvent les yeux et pourtant le compte est bon.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
ping est un programme qui utilise le protocole IP à bas niveau. L'exécutable doit se trouver quelque part dans system32 je pense, mais tu ne trouveras pas le code source sous Windows (pas la politique de la maison !), et pour le comprendre, il faudrait que tu aies de solides notions de réseau.

Place l'instruction suivante sur la première ligne de la boucle while stp :
printf( "Itération %i", i );
0
jeun's
 
voilà ce que ça donne,
à l'affichage, c'est le même topo, affichage du nombre de caractère, on ne passe pas à la phase n°6 , et y'a toujours la fnêtre window .

printf( "5\n" );
    
   i = 0;
  printf( "Longueur de chaine : %i", strlen( chaine ) );
  while ( i < strlen( chaine ) && !ok ) {
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
            printf( "Itération %i", i );
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        ++i;
      }
    }
    ++i;
  }

  printf( "6\n" );
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
printf( "5\n" );
    
  i = 0;
  while ( i < strlen( chaine ) && ok != 0 ) {
    printf( "Itération %i", i );
    printf( "Comparaison des chaines suivantes :\n'%s'\n'%s'\n\tTaille : %i\n", chaine[i], debut, taille );
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        ++i;
      }
    }
    ++i;
  }
0
jeun's
 
ET de 6 !!

mais il doit y avoir un dernier truc qui ne fonctionne pas car cela n'affiche pas la sous chaine, et la fenêtre window interromp encore le processus.
0
jeun's
 
non pas la phase 6 ne correspond pas à l'affichage du résulata mais à la selection de la sous chaine. je t'envoie le reste:

printf( "6\n" );
  
  // On recopie la sous-chaine comprise entre les indices de début et de fin dans la variable sous_chaine
  sous_chaine = malloc( ( indice_fin - indice_debut) * sizeof( char ) );
  strncpy( sous_chaine, chaine[indice_debut], indice_fin - indice_debut );

  printf( "7\n" );
  
  printf( "La sous-chaine trouvée est : %s", sous_chaine );
  
  getchar(); 
  return 0;
}


0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Je me suis planté dans le code de la boucle, elle n'est jamais exécutée ! Remplace ok != 0 par ok == 0 dans la condition du premier while...

Et dis-moi ce que tu passes comme chaine en entrée stp.
0
jeun's
 
Voici ce qio se passe quand j'écris la chaine suivante

"sd bonjour a au revoir sd"

( en fait il n'y a pas de probllème qqsoit les caractère que je rentre du moment qu'il y a bonjour et aurevoir).

ensuite il y a une nouveauté depuis que j'ai remplacé par "==".

On ne va pas jusqu'à 6, on revient à 5, ... MAIS , l'inscription " iteration 0" vient à la suite de 5.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
OK, le problème arrive donc dès la première itération... On va essayer de trouver où exactement, je te poste le code dans quelques minutes.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135 > pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention  
 
On ajoute un test pour vérifier si c'est strncmp qui pose problème et la boucle while devient :
  printf( "Début test\n" );
  strncmp( chaine[i], debut, taille );
  printf( "Fin test\n" );
  
  i = 0;
  while ( i < strlen( chaine ) && ok == 0 ) {
    printf( "i = %i", i );
    printf( "Comparaison des chaines suivantes :\n'%s'\n'%s'\n\tTaille : %i\n", chaine[i], debut, taille );
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      printf( "\tChaîne de début trouvée" );
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
        printf( "i = %i", i );
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          printf( "\tChaîne de fin trouvée" );
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        i+=1;
      }
    }
    i+=1;
  }
0
jeun's
 
ok merci !
0
jeun's
 
non ce n'est pas la boucle, il y a

debut test
fin test
i =0

... et fenêtre windows.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Bon, teste ça et donne moi l'affichage...
  while ( i < strlen( chaine ) && ok == 0 ) {
    printf( "i = %i", i );
    printf( "Comparaison des chaines suivantes :\n'%s'\n'%s'\n\tTaille : %i\n", chaine[i], debut, taille );
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      printf( "\tChaîne de début trouvée" );
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
        printf( "i = %i", i );
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          printf( "\tChaîne de fin trouvée" );
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        printf( "On incrémente i (boucle intérieure)" );
        ++i;
      }
    }
    printf( "On incrémente i (boucle extérieure)" );
    ++i;
  }
0
jeun's
 
tiens je te renvoie tout peut être qu'une vision globale de la chose ...

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf( "0\n" );
  const int TAILLE_CHAINE_MAX = 255;

  char debut[] = "bonjour";
  char fin[] = "au revoir";
  char chaine[TAILLE_CHAINE_MAX];
  printf( "1\n" );
  chaine[0] = -1; // Pour éviter que la valeur soit à 10 dès le départ, ce qui nous ferait sortir de la boucle
  chaine[TAILLE_CHAINE_MAX-1] = '\0';
  char * sous_chaine;
  printf( "2\n" );

  int i = 0;
  int indice_debut, indice_fin;
  int taille = strlen( debut );
  int ok = 0;
  printf( "3\n" );

  printf( "Écrivez un texte de la forme : \nblablabla bonjour blablabla au revoir blablabla\n(Maximum %i caractères)\n", TAILLE_CHAINE_MAX );

  // Tant que le caractère saisi n'est pas un saut de ligne et qu'on n'a pas atteint
  // le nombre de caractères maximum, on lit et on enregistre dans le tableau.
  
 scanf("%c", &chaine[i]);
  while ( chaine[i] != '\n' && i<TAILLE_CHAINE_MAX-1 ) {
    ++i;
    scanf("%c", &chaine[i]);
  }

  printf( "4\n" );
    
  if ( i < TAILLE_CHAINE_MAX-1 )
    { chaine[i] = '\0'; }

printf( "5\n" );
    
 printf( "Début test\n" );
  strncmp( chaine[i], debut, taille );
  printf( "Fin test\n" );
  
  i = 0;
  while ( i < strlen( chaine ) && ok == 0 ) {
    printf( "i = %i", i );
    printf( "Comparaison des chaines suivantes :\n'%s'\n'%s'\n\tTaille : %i\n", chaine[i], debut, taille );
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      printf( "\tChaîne de début trouvée" );
      i = i + taille;
      indice_debut = i;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( i < strlen( chaine ) - taille ) {
        printf( "i = %i", i );
        // Si on trouve la chaine fin...
        if ( strncmp( chaine[i], fin, taille ) == 0 ) {
          printf( "\tChaîne de fin trouvée" );
          // ...on enregistre l'indice
          indice_fin = i-1;
          // ...on sort
          ok = 1;
          break;
        }
        i+=1;
      }
    }
    i+=1;
  }


  printf( "6\n" );
  
  // On recopie la sous-chaine comprise entre les indices de début et de fin dans la variable sous_chaine
  sous_chaine = malloc( ( indice_fin - indice_debut) * sizeof( char ) );
  strncpy( sous_chaine, chaine[indice_debut], indice_fin - indice_debut );

  printf( "7\n" );
  
  printf( "La sous-chaine trouvée est : %s", sous_chaine );
  
  getchar(); 
  return 0;
}
0
jeun's
 
Alros il s'est passé plein de chose !

on reussi le test, on arrive jusqu'à la phase 6,

une fois arrivée à ce point, l'ordinateur paraît " hésiter" et la fenêtre window apparaît.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Donne moi l'affichage de l'exécution du programme stp.
0
jeun's
 
4
5
debut test
fin test
6

et puis fenêtre window qui indique que le programme a rencontré un probleme et me propose de'envoyer un rapport d'erreur
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Vire les debut et fin test. Pas d'affichage de l'indice ou autre pendant la boucle ?
0
jeun's
 
non pas d'affichage d'indice en fin de test.
0
jeun's
 
qu'est ce que tu crois qui se passe ? as u une piste de réflection , ou bien est ce le flou total ?
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
J'ai installé code::blocks avec compilo, ça gagne du temps ! Yavait des warning à la compil, j'ai corrigé, je fignole et ça devrait être vite bon !
0
jeun's
 
ok.
0
pyschopathe Messages postés 1974 Date d'inscription   Statut Membre Dernière intervention   135
 
Et voilà ! Ca fonctionne, trooooop facile ^^ !
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    const int TAILLE_CHAINE_MAX = 255;

    char * debut = "bonjour";
    char * fin = "au revoir";
    char chaine[TAILLE_CHAINE_MAX];
    chaine[0] = -1;
    chaine[TAILLE_CHAINE_MAX-1] = '\0';
    char * sous_chaine;

    int i = 0;
    int indice_debut = -1, indice_fin = -1;
    int taille = strlen( debut );
    int ok = 0;

    printf( "Ce programme trouve une sous-chaine comprise entre les chaines %s et %s.\n\n", debut, fin );
    printf( "Ecrivez un texte de la forme : \n[...] %s [...] %s [...] (Maximum %i caracteres)\n", debut, fin, TAILLE_CHAINE_MAX );

    // Tant que le caractère saisi n'est pas un saut de ligne et qu'on n'a pas atteint
    // le nombre de caractères maximum, on lit et on enregistre dans le tableau.
    scanf("%c", &chaine[i]);
    while ( chaine[i] != '\n' && i<TAILLE_CHAINE_MAX-1 ) {
        ++i;
        scanf("%c", &chaine[i]);
    }

    if ( i < TAILLE_CHAINE_MAX-1 )
    { chaine[i] = '\0'; }

    i = 0;
    while ( i < strlen( chaine ) && ok == 0 ) {
        // Si on trouve debut dans la chaine saisie
        if ( strncmp( &chaine[i], debut, taille ) == 0 ) {
            i = i + taille;
            indice_debut = i;
            taille = strlen( fin );
            // On cherche maintenant la chaine fin
            while ( i < strlen( chaine ) ) {
                // Si on trouve la chaine fin...
                if ( strncmp( &chaine[i], fin, taille ) == 0 ) {
                    // ...on enregistre l'indice
                    indice_fin = i-1;
                    // ...on sort
                    ok = 1;
                    break;
                }
                ++i;
            }
        }
        ++i;
    }

    if ( indice_fin > indice_debut && indice_debut >= 0 ) {
        // On recopie la sous-chaine comprise entre les indices de début et de fin dans la variable sous_chaine
        sous_chaine = malloc( ( indice_fin - indice_debut) * sizeof( char ) );
        strncpy( sous_chaine, &chaine[indice_debut], indice_fin - indice_debut + 1 );
        printf( "La sous-chaine trouvee est : '%s'.\n", sous_chaine );
    }
    else
        printf( "Aucune sous-chaine trouvee.\n" );

    return 0;
}

Bien sûr, s'il y a quelque chose que tu ne comprends pas, demande et j'expliquerai.
0