Mot se terminant par

Résolu
naltap312 Messages postés 4 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 2 mai 2010 - 2 mai 2010 à 07:37
naltap312 Messages postés 4 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 2 mai 2010 - 2 mai 2010 à 11:46
Bonjour,

tout novice et après moultes rélfexions, apparement pas assez, je n'arrive pas à coder une fonction me retournant si oui ou non un mot se termine par un mot.

voici mon code qui ne fonctionne pas ;)
int main() {

char *a = "Hello World!";
char *b = strstr(a, "World!");

int position = b - a;
int lengtha = strlen(a);
int lengthb = strlen(b);

printf("the offset is %i\n", position);
printf("length a = %d\n", lengtha);
printf("length b = %d\n", lengthb);

if(position>0 && a-b=a/2)
printf("se termine bien par.\n");
else
printf("ne se termine pas par.\n");

return 0;

}




Un peu d'aide est toujours bienvenue ;)
Merci
NaltaP312
A voir également:

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 mai 2010 à 11:18
Je te propose deux méthodes:
La première est une correction de ce que tu as fait.
La deuxième est une version "fait main" (on peut sûrement faire mieux).

#include <stdio.h>
#include <string.h>

int endWith(char* stack, char* needle)
{
  char* posStack = stack;
  char* posNeedle = needle;

  while (*stack)
    ++stack;
  while (*needle)
    ++needle;

  while (stack != posStack && needle != posNeedle)
  {
    if (*stack != *needle)
      return 0;
    --stack;
    --needle;
  }

  return needle == posNeedle;
}

int main(void)
{
  /* 1 */
  char* a = "Hello World!";
  char* b = strstr(a, "World!");
  int lengthword = strlen("World!");
  int length = 0;

  if (b == NULL)
    printf("ne se termine pas par.\n");

  length = strlen(b);

  if (lengthword == length)
    printf("se termine bien par.\n");
  else
    printf("ne se termine pas par.\n");

  /* 2 */

  if (endWith("Hello World!", "World!"))
    printf("se termine bien par.\n");
  else
    printf("ne se termine pas par.\n");

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2010 à 11:00
Pas testé mais devrait aller:
int SeTerminePar(char *a, char *b)
{
DWORD lmotif, lsrc;
int v;
lmotif = strlen(b);
lsrc = strlen(a);
if(lmotif > lsrc) return 0;
lsrc -= lmotif;
v = strcmp(a + lsrc, b);
return ((v == 0) ? 1: 0);
}

ciao...
BruNews, MVP VC++
0
naltap312 Messages postés 4 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 2 mai 2010
2 mai 2010 à 11:16
Merci pour ce retour, mais il semble que cela ne fonctionne pas (je l'ai modifié pour du c "standard")
et si je change avec un motif n'étant pas dans le premier mot, j'ai un segmentation fault.

Par contre je pense que je vais jouer sur une fonction substring et une comparaison de mot.

Sinon voici le code retouché pour du c
#include <stdio.h>
#include <string.h>


int SeTerminePar(char *a, char *b) { 

unsigned long lmotif, lsrc; 

int v; 
lmotif = strlen(b); 
lsrc = strlen(a); 
if(lmotif > lsrc) return 0; 
lsrc -= lmotif; 
v = strcmp(a + lsrc, b); 
return ((v == 0) ? 1: 0); 
}

int main() {

char *a = "Hello World!";
char *b = strstr(a, "Coucou");
printf("se termine par=%d\n", SeTerminePar(a,b));
}




Bon week end ;)
0
naltap312 Messages postés 4 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 2 mai 2010
2 mai 2010 à 11:23
Encore merci pour ce soutien.

Je viens juste de tester ce code.
c'est nickel pour le premier test.
Par contre si le mot est contenu mais pas à la fin, le deuxième test ne fonctionne pas.

Merci encore ;)
#include <stdio.h>
#include <string.h>

int endWith(char* stack, char* needle)
{
  char* posStack = stack;
  char* posNeedle = needle;

  while (*stack)
    ++stack;
  while (*needle)
    ++needle;

  while (stack != posStack && needle != posNeedle)
  {
    if (*stack != *needle)
      return 0;
    --stack;
    --needle;
  }

  return needle == posNeedle;
}

int main(void)
{
  /* 1 */
  char* a = "Hello World! coucou";
  char* b = strstr(a, "World!");
  int lengthword = strlen("World!");
  int length = 0;

  if (b == NULL)
    printf("ne se termine pas par.\n");

  length = strlen(b);

  if (lengthword == length)
    printf("se termine bien par.\n");
  else
    printf("ne se termine pas par.\n");

  /* 2 */

  if (endWith(a, b))
    printf("se termine bien par.\n");
  else
    printf("ne se termine pas par.\n");

  return 0;
}

0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 mai 2010 à 11:27
Par contre si le mot est contenu mais pas à la fin, le deuxième test ne fonctionne pas.

Si le mot est contenu mais pas à la fin, alors ta phrase ne finit pas par ce mot. C'est donc normal.
Regarde quand même la solution de Brunews, je n'ai pas cherché à faire quelque chose d'optimisé.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2010 à 11:30
Le MOTIF !!! pas le résult de strstr()...

int main() {
printf("se termine par=%d\n", SeTerminePar("Hello World!", "World!"));
}

ciao...
BruNews, MVP VC++
0
naltap312 Messages postés 4 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 2 mai 2010
2 mai 2010 à 11:46
ok merci, je vais suivre les conseils.

CommencePar est plus simple d'ailleurs à faire ;)
Bon week à tous
NaltaP312
0
Rejoignez-nous