Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1590 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] fonction pour remplacer du texte dans une string

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] fonction pour remplacer du texte dans une string

n°1564512
cheff
Posté le 24-05-2007 à 12:22:58  profilanswer
 

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

mood
Publicité
Posté le 24-05-2007 à 12:22:58  profilanswer
 

n°1564544
_darkalt3_
Proctopathe
Posté le 24-05-2007 à 13:12:41  profilanswer
 
n°1564626
matafan
Posté le 24-05-2007 à 15:08:02  profilanswer
 

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

n°1564631
zecrazytux
Posté le 24-05-2007 à 15:13:21  profilanswer
 

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
n°1564636
_darkalt3_
Proctopathe
Posté le 24-05-2007 à 15:20:06  profilanswer
 

Essaye.


---------------
Töp of the plöp
n°1564640
zecrazytux
Posté le 24-05-2007 à 15:22:54  profilanswer
 

non.


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1564641
Elmoricq
Modérateur
Posté le 24-05-2007 à 15:23:00  profilanswer
 

zecrazytux a écrit :

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


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

n°1564643
zecrazytux
Posté le 24-05-2007 à 15:23:47  profilanswer
 

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
n°1564682
matafan
Posté le 24-05-2007 à 16:22:14  profilanswer
 

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.

n°1565721
el muchach​o
Comfortably Numb
Posté le 26-05-2007 à 23:16:24  profilanswer
 

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
mood
Publicité
Posté le 26-05-2007 à 23:16:24  profilanswer
 

n°1565873
kaiser52
Posté le 27-05-2007 à 17:47:59  profilanswer
 

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
n°1565882
_darkalt3_
Proctopathe
Posté le 27-05-2007 à 18:07:28  profilanswer
 

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
n°1565893
kaiser52
Posté le 27-05-2007 à 18:25:35  profilanswer
 

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


---------------
Benchmarks du peuple - Crysis War - Vide grenier ! - nVIDIA Tegra
n°1565912
_darkalt3_
Proctopathe
Posté le 27-05-2007 à 18:56:32  profilanswer
 

kaiser52 a écrit :

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


'k lol


---------------
Töp of the plöp
n°1565919
kaiser52
Posté le 27-05-2007 à 19:15:53  profilanswer
 

_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
n°1565962
Elmoricq
Modérateur
Posté le 27-05-2007 à 21:21:10  profilanswer
 
n°1566073
nORKy
Grmmph...
Posté le 28-05-2007 à 11:30:03  profilanswer
 

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
n°1566076
nORKy
Grmmph...
Posté le 28-05-2007 à 11:37:51  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] fonction pour remplacer du texte dans une string

 

Sujets relatifs
Manipuler un simple fichier texte ?!fonction recherche de plusieurs éléments
remplacer un ligne dans un fichierUtilisation d'une fonction..
Fonction recursive, Help[Divers] Quel éditeur de texte pour mon besoin
Lecture/Ecriture fichier texte vs MySQL ?Detecter un texte dans une page php
VB2005 : Conversion d'une valeur string en valeur numériqueMAJ les valeurs retournées par une fonction
Plus de sujets relatifs à : [C] fonction pour remplacer du texte dans une string


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR