[C] fonction pour remplacer du texte dans une string

fonction pour remplacer du texte dans une string [C] - C - Programmation

Marsh Posté le 24-05-2007 à 12:22:58    

Bonjour,  
 
je recherche une fonction en C qui chercherai dans une grosse string ( en fait le contenue d'un fichier ) un bout de texte, et qui remplacerai ce bout de texte par un autre texte.
 
Cela existe-t-il ? Je n'ai rien trouver de concluant :-/
 
 
merci d'avance

Reply

Marsh Posté le 24-05-2007 à 12:22:58   

Reply

Marsh Posté le 24-05-2007 à 13:12:41    

Reply

Marsh Posté le 24-05-2007 à 15:08:02    

Y'a pas, faut te le faire à la main (à partir de strstr effectivement).

Reply

Marsh Posté le 24-05-2007 à 15:13:21    

est il possible de remplacer le mot par un mot de plus grande taille ?


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 24-05-2007 à 15:20:06    

Essaye.


---------------
Töp of the plöp
Reply

Marsh Posté le 24-05-2007 à 15:22:54    

non.


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 24-05-2007 à 15:23:00    

zecrazytux a écrit :

est il possible de remplacer le mot par un mot de plus grande taille ?


 
Oui, avec strstr() + realloc() + memcpy() [:dawa]

Reply

Marsh Posté le 24-05-2007 à 15:23:47    

Elmoricq a écrit :

Oui, avec strstr() + realloc() + memcpy() [:dawa]


 
ah oui un petit realloc :)
 
merci ;)


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 24-05-2007 à 16:22:14    

zecrazytux a écrit :

est il possible de remplacer le mot par un mot de plus grande taille ?


Par un mot de plus petite taille non plus, d'ailleurs.

Reply

Marsh Posté le 26-05-2007 à 23:16:24    

Elmoricq a écrit :

Oui, avec strstr() + realloc() + memcpy() [:dawa]


memmove()

Message cité 1 fois
Message édité par el muchacho le 26-05-2007 à 23:20:03
Reply

Marsh Posté le 26-05-2007 à 23:16:24   

Reply

Marsh Posté le 27-05-2007 à 17:47:59    

Oui mais la vous parlez en C++, le monsieur cherche en C la syntax est pas vraiment identique.
Bon je me lance sur le sujet alors XD
 
Bon j'ai fais un prog qui cherche une chaine dans une autre.
C'est pas super beau mais ca fait une base.
 

Citation :

/*
** str_search.c for str_max in /nfs/exam/users/login/rendu/ex_3
**
** Made by exam user
** Login   <schehl_c@epita.fr>
**
** Started on  Sat Mar 24 10:48:55 2007 exam user
** Last update Sun May 27 17:56:59 2007 clement schehl
*/
 
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
 
void my_putchar(char c)
{
  write(1, &c, 1);
}
 
void my_putstr(char *str)
{
  int i;
 
  for (i = 0; str[i]; i++)
    my_putchar(str[i]);
}
 
int my_strlen(char *str)
{
  int i;
 
  for (i = 0; str[i]; i++)
    ;
  return (i);
}
 
int my_strcmp(char *s1, char *s2)
{
  int i;
  int len;
 
  len = my_strlen(s1);
  for (i = 0; i < len; i++)
    if (s1[i] != s2[i])
      return (-1);
  return (0);
}
 
int str_str(char *s1, char *s2)
{
  int len;
  int cpt;
  int i;
  int j;
 
  len = my_strlen(s1);
  if (my_strcmp(s1, s2) == -1)
    for (j = 0; s2[j]; j++)
      {
 cpt = 0;
 if (s2[j] == s1[0])
   {
     for (i = 0; s1[i] == s2[j]; i++, j++)
       cpt++;
     if (cpt == len)
       return (0);
   }
      }
  else
    return (0);
  return (-1);
}
 
char *my_str(char *str, int j)
{
  char *str_2;
  int i;
 
  if ((str_2 = malloc(sizeof(char) * (my_strlen(str) + 1))) == NULL)
    exit(-1);
  else
    {
      for (i = 0; str[j]; j++, i++)
 str_2[i] = str[j];
      str_2[i] = '\0';
    }
  return (str_2);
}
 
char *my_str_2(char *str, int j)
{
  char *str_2;
  int i;
 
  if ((str_2 = malloc(sizeof(char) * (my_strlen(str) + 1))) == NULL)
    exit(-1);
  else
    {
      for (i = 0; i < j; i++)
 str_2[i] = str[i];
      str_2[i] = '\0';
    }
  return (str_2);
}
 
int str_search(int ac, char **av)
{
  char *str;
  int len;
  int flag;
  int i;
  int j;
  int end;
  char *sav;
  int minus;
 
  j = 0;
  end = 0;
  str = my_str(av[1], j);
  len = my_strlen(av[1]);
  minus = len;
  sav = my_str(av[1], j);
  while (flag < (ac - 1))
    {
      flag = 0;
      for (i = 1; i < ac; i++)
 if (str_str(str, av[i]) == 0)
   flag++;
      if (flag == (ac - 1))
 my_putstr(str);
      else
 {
   if (my_strlen(str) > 1)
     {
       minus--;
       str = my_str_2(str, minus);
     }
   else
     {
       j++;
       str = my_str(av[1], j);
       sav = my_str(str, 0);
       minus = my_strlen(sav);
     }
 }
    }
  return (0);
}
 
int main(int ac, char **av)
{
  if (ac > 1)
    str_search(ac, av);
  my_putchar('\n');
  return (0);
}


 
Str_search trouve la chaine la plus grande qui correspond entre 2 chaines.
Ex : salut   "sal bon les gars ca va sur HFR, bon salut !"
il affichera salut.
Il suffit de modifier pour retourner l'index. et modifier la chaine a votre guise.
Y'a quelques bugs a resoudres, et le premier argument c'est le mot a rechercher, et le second c'est la chaine ou il faut chercher.
Bon en esperant avoir aide. Marre de travallier les dimanche !

Message cité 1 fois
Message édité par kaiser52 le 27-05-2007 à 18:03:16

---------------
Benchmarks du peuple - Crysis War - Vide grenier ! - nVIDIA Tegra
Reply

Marsh Posté le 27-05-2007 à 18:07:28    

kaiser52 a écrit :

Oui mais la vous parlez en C++, le monsieur cherche en C la syntax est pas vraiment identique.
Bon je me lance sur le sujet alors XD
 
Bon j'ai fais un prog qui cherche une chaine dans une autre.
C'est pas super beau mais ca fait une base.
 

Citation :

/*
** str_search.c for str_max in /nfs/exam/users/login/rendu/ex_3
**
** Made by exam user
** Login   <schehl_c@epita.fr>
**
** Started on  Sat Mar 24 10:48:55 2007 exam user
** Last update Sun May 27 17:56:59 2007 clement schehl
*/
 
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
 
void my_putchar(char c)
{
  write(1, &c, 1);
}
 
void my_putstr(char *str)
{
  int i;
 
  for (i = 0; str[i]; i++)
    my_putchar(str[i]);
}
 
int my_strlen(char *str)
{
  int i;
 
  for (i = 0; str[i]; i++)
    ;
  return (i);
}
 
int my_strcmp(char *s1, char *s2)
{
  int i;
  int len;
 
  len = my_strlen(s1);
  for (i = 0; i < len; i++)
    if (s1[i] != s2[i])
      return (-1);
  return (0);
}
 
int str_str(char *s1, char *s2)
{
  int len;
  int cpt;
  int i;
  int j;
 
  len = my_strlen(s1);
  if (my_strcmp(s1, s2) == -1)
    for (j = 0; s2[j]; j++)
      {
 cpt = 0;
 if (s2[j] == s1[0])
   {
     for (i = 0; s1[i] == s2[j]; i++, j++)
       cpt++;
     if (cpt == len)
       return (0);
   }
      }
  else
    return (0);
  return (-1);
}
 
char *my_str(char *str, int j)
{
  char *str_2;
  int i;
 
  if ((str_2 = malloc(sizeof(char) * (my_strlen(str) + 1))) == NULL)
    exit(-1);
  else
    {
      for (i = 0; str[j]; j++, i++)
 str_2[i] = str[j];
      str_2[i] = '\0';
    }
  return (str_2);
}
 
char *my_str_2(char *str, int j)
{
  char *str_2;
  int i;
 
  if ((str_2 = malloc(sizeof(char) * (my_strlen(str) + 1))) == NULL)
    exit(-1);
  else
    {
      for (i = 0; i < j; i++)
 str_2[i] = str[i];
      str_2[i] = '\0';
    }
  return (str_2);
}
 
int str_search(int ac, char **av)
{
  char *str;
  int len;
  int flag;
  int i;
  int j;
  int end;
  char *sav;
  int minus;
 
  j = 0;
  end = 0;
  str = my_str(av[1], j);
  len = my_strlen(av[1]);
  minus = len;
  sav = my_str(av[1], j);
  while (flag < (ac - 1))
    {
      flag = 0;
      for (i = 1; i < ac; i++)
 if (str_str(str, av[i]) == 0)
   flag++;
      if (flag == (ac - 1))
 my_putstr(str);
      else
 {
   if (my_strlen(str) > 1)
     {
       minus--;
       str = my_str_2(str, minus);
     }
   else
     {
       j++;
       str = my_str(av[1], j);
       sav = my_str(str, 0);
       minus = my_strlen(sav);
     }
 }
    }
  return (0);
}
 
int main(int ac, char **av)
{
  if (ac > 1)
    str_search(ac, av);
  my_putchar('\n');
  return (0);
}


 
Str_search trouve la chaine la plus grande qui correspond entre 2 chaines.
Ex : salut   "sal bon les gars ca va sur HFR, bon salut !"
il affichera salut.
Il suffit de modifier pour retourner l'index. et modifier la chaine a votre guise.
Y'a quelques bugs a resoudres, et le premier argument c'est le mot a rechercher, et le second c'est la chaine ou il faut chercher.
Bon en esperant avoir aide. Marre de travallier les dimanche !


 
 
Où t'as vu du c++ ?? [:mlc]
Dans l'url de la dernière intervention ? [:mlc]


---------------
Töp of the plöp
Reply

Marsh Posté le 27-05-2007 à 18:25:35    

Ouai dans l'url apres j'ai pas cherche plus loin ^^


---------------
Benchmarks du peuple - Crysis War - Vide grenier ! - nVIDIA Tegra
Reply

Marsh Posté le 27-05-2007 à 18:56:32    

kaiser52 a écrit :

Ouai dans l'url apres j'ai pas cherche plus loin ^^


'k lol


---------------
Töp of the plöp
Reply

Marsh Posté le 27-05-2007 à 19:15:53    

_darkalt3_ >> Tu penses quoi de se bout de programme ?? Par-ce-que je débute dans la programmation, j'ai moins d'un an de pratique.


---------------
Benchmarks du peuple - Crysis War - Vide grenier ! - nVIDIA Tegra
Reply

Marsh Posté le 27-05-2007 à 21:21:10    

Reply

Marsh Posté le 28-05-2007 à 11:30:03    

J'ai cette fonction sous la main.
Attention, il y avait certaines restrictions (pas utiliser asprintf ou realloc)
Donc, avec quelques adaptation, elle devrait encore être plus performante
 
Elle renvoie une nouvelle chaine alloué avec malloc.

Code :
  1. char *str_replace(char *str, char *search, char *replace)
  2. {
  3.   char *f;
  4.   char *tmp;
  5.   char *res;
  6.   f = strstr(str, search);
  7.   if (f == NULL)
  8.     return (strdup(str));
  9.   tmp = str_ndup(str, f - str);
  10.   res = str_concat(2, tmp, replace);
  11.   free(tmp);
  12.   f += strlen(search);
  13.   tmp = str_concat(2, res, f);
  14.   free(res);
  15.   res = tmp;
  16.   if (strstr(res, search) != NULL) {
  17.     tmp = str_replace(res, search, replace);
  18.     free(res);
  19.     res = tmp;
  20.   }
  21.   return (res);
  22. }


 
str_ndup est une fonction perso (car strndup n'existe pas sur BSD)
str_concat aussi, le premier nombre est le nombre de chaine à concaténer, et renvoie une chaine alloué avec malloc.
Fonction récusive (mais ne détecte pas les possible boucle infinie, attention)
C'est pas super ,mais mieux que rien, ca peut déjà t'aider.


Message édité par nORKy le 28-05-2007 à 11:30:16
Reply

Marsh Posté le 28-05-2007 à 11:37:51    

Il y'a beaucoup plus simple que ce que j'ai posté (mais si t'es dans l'urgence, c'est mieux que rien).
Avec un seul malloc et quelques soustraction/addition de pointeurs, c'est fesable facilement.


Message édité par nORKy le 28-05-2007 à 11:38:03
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed