Un truc tout bête et pourtant casse tête
Résolu
jeun's
-
EL barto ! -
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 ?
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 ?
A voir également:
- Un truc tout bête et pourtant casse tête
- Un pense-bête - Guide
- Tête de parabole défectueuse - Forum TV & Vidéo
- Réparation écran tv samsung cassé ✓ - Forum Téléviseurs
- L'en-tête du document comporte une information qui n’apparaît pas à l'impression car elle est de couleur blanche. de quelle information s'agit-il ? ✓ - Forum Bureautique
- Écran ordinateur cassé sans choc - Forum Ecran
63 réponses
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; }
non, c'est bon, je viens de finir le paragrpahe sur le concatenage, ça n'a tout simplement rien à voir.
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 .
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 .
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
SAlut !!
ça indique le nombre de caractère aprés 4 et 5, puis la fenêtre window ( une erreure etc .. rapport d'erreure) ...
ça indique le nombre de caractère aprés 4 et 5, puis la fenêtre window ( une erreure etc .. rapport d'erreure) ...
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 !
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 !
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 ?
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 ?
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.
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.
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 :
Place l'instruction suivante sur la première ligne de la boucle while stp :
printf( "Itération %i", i );
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 .
à 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" );
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; }
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.
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.
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; }
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.
"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.
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; }
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; }
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; }
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.
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.
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
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
Et voilà ! Ca fonctionne, trooooop facile ^^ !
Bien sûr, s'il y a quelque chose que tu ne comprends pas, demande et j'expliquerai.
#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.