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

Résolu/Fermé
jeun's - 23 oct. 2008 à 22:46
EL barto ! Messages postés 121 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 7 août 2009 - 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

je m'y connais encore moins que toi ! je ne sai pas
0
Mais pourtant je n'arrive pas à faire définir ni bonjour, ni au revoir ?
0
Mais pourtant je n'arrive pas à faire définir ni bonjour, ni au revoir ?
et là , je vois vraiment pas pourquoi . tu vois toi ?
0
ok, attends je vais essayer en les enlevant alors ...
non ça ne donne que "undeaclared " first use in this function ...
0
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:21
Copie-colle le code que j'ai mis juste au-dessus.
-1

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

Posez votre question
je copie je colle et ... ET ! et non :(
il me redis que c'est trop long pour ce type . j'ai essayé en enlevant les (') .. il me répete que bonjour es undeclared.


Il faut absolument qu'il connaisse bonjour et au revoir, sinon il ne pourra pas les reconnaitre dans le texte.

alors j'avoue être paumé.

comment on déclare une chaine de caractère d'habitude , comme ça non ?

char v=bonjour

??
0
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:31
Non,
char v[] = "bonjour";
il faut mettre les double quotes.
-1
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:32
Le but du programme est bien de reconnaitre la chaine comprise entre "bonjour" et "au revoir" ?
-1
Ok super mon bonjour et mon au revoir on l'air de bien être pris en compte , maintenant je vais essayé d'isoler le texte qui se situe entre ces deux mots . merci. je vais chercher de mon côté quelque temps, et sinon ben, je sais que tu es là.

je passe en pb résolu, et si je n'y arrive pas, et bien je reste " jeun's" ,
et toi aussi ! ;) merci
0
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:45
J'ai fait une version rapide du programme, je ne sais pas si elle marche, mais le principe devrait être bon (bien que pas forcément optimal). Si tu as 5 minutes teste-le et dis-moi si ça fonctionne.
#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; // 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;

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

  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]);

  if ( i < TAILLE_CHAINE_MAX-1 )
    chaine[i] = "\0";

  i = 0;
  while ( chaine[i] != "\0" && !ok ) {
    // Si on trouve debut dans la chaine saisie
    if ( strncmp( chaine[i], debut, taille ) == 0 ) {
      indice_debut = i = i + taille;
      taille = strlen( fin );
      // On cherche maintenant la chaine fin
      while ( chaine[i] != "\0" && 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;
  }

  // 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( "La sous-chaine trouvée est : %s", sous_chaine );

  getchar();
  return 0;
} 
-1
oui c'est bien le but du programme .
0
Alors, j'ai essayé ton programme,

Il arrive la même chose que ce que tu m'avais expliqué pour la boucle infinie qui fait apparaitre la fenêtre window.

J'en conclue ( mais bon .. mes conclusions tu sais .... ) qu'il doit y avoir là encore une boucle qui n'est pas fermée .

Je suis en train de la chercher.

(mais je ne lis pas aussi vite le code que tu l'écris :)

ps: ( avant j'était " rem's ") j'ai publié la question "j'ai un problème de programmation à résoudre".
0
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:03
C'est possible que ce soit un problème d'accès mémoire, vérifie que je n'aie pas fait d'erreur avec le malloc par exemple, je suis loin d'être un spécialiste du C ! A priori, les boucles devraient se terminer...
-1
Non en fait, y'a pas d'apparition de fenêtre window, mais la fonction le texte recherché n'apparait pas .
0
tiens je t'envoie l'intégrale. mais je ne pense pas mêtre tromper en coupant et remplaçant le dernier bout. mais ..


------------------------------------

#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; // 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;

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

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]);

if ( i < TAILLE_CHAINE_MAX-1 )
chaine[i] = "\0";

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

// 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( "La sous-chaine trouvée est : %s", sous_chaine );


-------------------------------------------------------------------
0
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:30
Et utilise les balises code ;-p
-1
je suis vraiment désolé, mais il n'y a toujours rien à l'affichage .

je ne sais pas où ça s'interrompt. tiens je te renvoie encore une fois l'intégrale il y a d'autres (") à remplacé par des (') .
---------------------------------------------------------------
#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; // 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;

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

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]);

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

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


// 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( "La sous-chaine trouvée est : %s", sous_chaine );

getchar();
return 0;
}
-------------------------------------------------------------------------
0
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:37
Gredin ! Les balises code ! Tsssk ! Est-ce que le compilo renvoie une erreur ou est-ce que c'est à l'exécution qu'il n'y a aucun résultat ?
-1
C'est à l'éxecution qu'il n'y a aucun résultat .
0
( ça y est j'ai comprise ce que tu appelais les balises code) (désolé d'avoir gâché)

#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; // 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;

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

  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]);

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

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

  // 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( "La sous-chaine trouvée est : %s", sous_chaine );

  getchar();
  return 0;
} 
0
Alors au dessus de l'instruction écrire un texte .... blbalab je lie 0123 .
j'ai réessayé le programme même .. " absence" de résultat .
à quoi tu penses ?
0
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:54
Remplace la boucle par celle-ci :
  for ( i=0 ; chaine[i] != '\n' && i<TAILLE_CHAINE_MAX-1 ; ++i )
    { scanf("%c", &chaine[i]); }

Et dis moi ce que ça t'affiche.
-1
EL barto ! Messages postés 121 Date d'inscription samedi 25 octobre 2008 Statut Membre Dernière intervention 7 août 2009 6 > pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010
25 oct. 2008 à 01:42
bon je me suis inscrit et je m'appelle finallement El barto ( y'avais déjà un autre jeun's) , allé bonne soirée et au plaisir et merci encore.
-1
ça m'affiche toujours la même chose,

9 semble s'arrêter à l'étape trois. et le compilateur n'a rien detécté. Tout semble faire comme si le programme ne passait pas à l'étape 4 .
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 01:01
C'est le test d'arrêt de la boucle qui n'est pas bon, on va y arriver ! Remplace la par ça :
  for ( i=0 ; chaine[i] != '.' && i<TAILLE_CHAINE_MAX-1 ; ++i )
    { scanf("%c", &chaine[i]); }
0
Et bien, je suis vraiment navré, mais ç a ne dépasse pas 3 .

je te recopie texto ce que je vois même si tu dois t'en douter evidémment :

0
1
2
3
ecrivez un texwte de la forme :
blablabla bonjour blablabla au revoir blablabla ( bon et pui le reste du texte, je peux saisir un texte que j'écri, et quand j'entre y'à rien qui se passe.

pour quoi elle ne se ferme pas . je ne vois pas .
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 01:10
Pardon, j'ai oublié de préciser qu'il fallait que tu termines le texte saisi par un point '.' (forcément ça va pas marcher sinon ^^ )
0
excuse , mais je te jure que j'ai mis un (.) à la fin du texte ! et il ne se passe absolument rien !
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 01:24
Et ben teste ça :
  scanf("%c", &chaine[i]);
  while ( chaine[i] != '\n' && i<TAILLE_CHAINE_MAX-1 ) {
    ++i;
    scanf("%c", &chaine[i]);
  }

Et si ça ne marche pas remplace le '\n' par '.'.
Et si ça ne marche toujours pas, ben on cherchera encore...
0
Attention !!!!!

4 ET 5 !!!!
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 01:28
Ooooooh yeah ! Et t'as un résultat ?
0
Non, pas de résultat ça s'arrête à 5 .

est ce que ça peut se faire en "concatenant" avec les fonction strncat et strcat ?
0
attends, non j'ai pas de résultat, mais j'ai une réaction !

une fenêtre windows !

il ya un pb, tuti quanti rapport d'erreur ...
0
pyschopathe Messages postés 1974 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
24 oct. 2008 à 01:47
Ça te fait une erreur avec toutes les entrées ou seulement de temps en temps ?
0