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

Résolu/Fermé
jeun's - 23 oct. 2008 à 22:46
 EL barto ! - 27 oct. 2008 à 15:33
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

pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
23 oct. 2008 à 23:11
Comment ça tu n'arrives pas à faire définir ?
-1
et bien sur la ligne

char v[8] = 'bonjour';

le compilateur s'arrête, et indique

[ warning] caractere constant too long for its type

C'est apparemment pas le bon type. non ?
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135 > jeun's
23 oct. 2008 à 23:17
char v[] = "bonjour";

Les simples quotes ( ' ) sont utilisés pour les caractères simples, pas pour les chaines de caractères.
-1
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 00:09
Essaie de modifier comme suit et donne moi le résultat de l'affichage stp :
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;
  }

Rentre le texte bonjour coucou au revoir.
-1
Et bien je ne sais pas trop quoi penser ,

9a bloque au niveau de la ligne

chaine[TAILLE_CHAINE_MAX-1] = "\0";

( vers le début dans la déclaration .)

le compilateur indique :
'in function main .


là je suis largué .
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135 > jeun's
24 oct. 2008 à 00:29
Remplace les "\0" par '\0', ça devrait être mieux ^^ !
-1
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 00:48
#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.
  for ( i=0 ; chaine[i] != 10 && 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" );
    
  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;
  }

  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;
}

Essaie ça et dis moi quel est le dernier chiffre affiché.
-1