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

  FORUM HardWare.fr
  Programmation
  C

  (C) Remplacer des espaces par des underscores

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

(C) Remplacer des espaces par des underscores

n°705524
manuuu
Posté le 21-04-2004 à 23:42:52  profilanswer
 

salut
apres une recherche infructueuse sur le forum je me permets de poser cette question
il s'agit d'une chaine de caractere avec des espaces a remplacer par des underscores
 
j'ai ecris une petite fonction mais qui deglingue un peu tout car elle bouffe les espaces :
 

Code :
  1. ajout_underscore()
  2. {
  3. int lettre=0,i;
  4. char occurence;
  5. extern char chainecar[255];
  6. for (i=0;i<255;i++)
  7. {
  8.   chainecar[i]='\0';
  9. }
  10. while ((occurence=getchar()) != '\n')
  11. {
  12.   if (occurence==' ') chainecar[lettre]='_';
  13.   else chainecar[lettre]=occurence;
  14.   lettre++;
  15. }
  16. }


 
je cherche egalement a empecher dans mon prog la saisie de caracteres non voulus en evitant les if partout
 
style : choix o ou n
eviter autre chose sinon ca plante (car je recupere un car seul)
 
merci de votre aide !

mood
Publicité
Posté le 21-04-2004 à 23:42:52  profilanswer
 

n°705531
Taz
bisounours-codeur
Posté le 21-04-2004 à 23:53:44  profilanswer
 

1) utilise fgets
2) utilise memset

n°705578
Taz
bisounours-codeur
Posté le 22-04-2004 à 01:08:56  profilanswer
 

t'es pas entrain de faire ça parce que par exemple scanf bloque au premier espace alors tu tapes des _ ?

n°705584
Taz
bisounours-codeur
Posté le 22-04-2004 à 01:40:31  profilanswer
 

on va gagner un peu de temps
 

Code :
  1. #include <string.h>
  2. char* str_replace(char* const str, char old, char new)
  3. {
  4.   char* ptr;
  5.  
  6.   for(ptr = str; *ptr; ++ptr)
  7.     {
  8.       if(*ptr == old)
  9. *ptr = new;
  10.     }
  11.   return str;
  12. }
  13. #include <stdio.h>
  14. int main()
  15. {
  16.   char line[80];
  17.   while(fgets(line, sizeof line, stdin))
  18.     {
  19.       str_replace(line, ' ', '_');
  20.       printf("-> %s", line);
  21.     }
  22.   return 0;
  23. }


Message édité par Taz le 22-04-2004 à 01:42:46
n°707564
manuuu
Posté le 23-04-2004 à 23:20:24  profilanswer
 

salut et merci pour ton aide
 
j'ai fait autrement en fait car je n'avais plus acces au net
je ne savais pas que str_replace existait en C !!
 
merci encore

n°707565
Taz
bisounours-codeur
Posté le 23-04-2004 à 23:23:24  profilanswer
 

str_replace n'existe pas en C, c'est moi qui te la file :os

n°707650
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:03:41  profilanswer
 

plus simple :

Code :
  1. while (psz=strchr(szMaChaine,' '))
  2. {
  3. *psz = '_';
  4. }

n°707654
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:25:57  profilanswer
 

christophe_d13 a écrit :

plus simple :

Code :
  1. while (psz=strchr(szMaChaine,' '))
  2. {
  3. *psz = '_';
  4. }



plus long. autant de parcour de la chaine que de remplacements.

n°707659
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:38:48  profilanswer
 

Taz> Tout à fait. Mais quand on ne cherche pas la vitesse à tout prix, mais plus une lisibilité, c'est plus simple.
 
Allez un code plus rapide juste pour toi.

Code :
  1. psz = szMaChaine;
  2. while (psz=strchr(psz,' '))
  3. {
  4.     *psz = '_';
  5.     psz++;
  6. }


Message édité par christophe_d13 le 24-04-2004 à 12:39:07
n°707664
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:43:04  profilanswer
 

la t'es passé de O(n²) à o(n²/2)
 
la version de str_replace que j'ai donné est simple, y a rien a redire je pese ?

mood
Publicité
Posté le 24-04-2004 à 12:43:04  profilanswer
 

n°707668
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:45:58  profilanswer
 

Taz> Nos deux routines font la même chose et ont le même nombre d'itération à ceci près :
La tienne - Traîte de façon directe la chaine et est moins lisible pour le débutant.
La mienne - Traîte de façon indirecte avec un appel à une fonction et est plus lisible pour un débutant.


Message édité par christophe_d13 le 24-04-2004 à 12:46:07
n°707673
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 12:54:17  profilanswer
 

Juste pour le fun
 
char * str_replace(char * pszText, char cold, char cnew )  
{
    char * psz = pszText;
    for (;*psz; ((*psz)==cold)?(*psz++=cnew):(psz++));
}

n°707676
Taz
bisounours-codeur
Posté le 24-04-2004 à 12:59:23  profilanswer
 

t'en a pas marre de nou pourir avec ta notation hongroise de merde ?

n°707679
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 13:03:17  profilanswer
 

Taz> C'est devenu une habitude... Non pas de pourrir les posts :pt1cable:, mais d'utiliser la notation hongroise. Je sais que peux sont ceux qui l'aiment, l'apprécient ou l'utilisent. Mais je la trouve assez pratique au final. De toute façon, là où je bosse on se la fixé dans nos rêgles de dvlp.


Message édité par christophe_d13 le 24-04-2004 à 13:05:10
n°707680
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 13:06:30  profilanswer
 

Comme disait Coluche, hongrois qu'on baise, mais on baise pas.

n°707682
Taz
bisounours-codeur
Posté le 24-04-2004 à 13:10:01  profilanswer
 

http://mindprod.com/unmain.html
 
Hungarian Notation
: Hungarian Notation is the tactical nuclear weapon of source code obfuscation techniques; use it! Due to the sheer volume of source code contaminated by this idiom nothing can kill a maintenance engineer faster than a well planned Hungarian Notation attack.

n°707687
christophe​_d13
L'efficacité à tout prix.
Posté le 24-04-2004 à 13:16:54  profilanswer
 

Déjà vu.

n°707851
manuuu
Posté le 24-04-2004 à 22:05:55  profilanswer
 

Salut, alors en fait j'ai pas pris vos code mais j'ai essayé par moi même :D
paceque je voulais rajouter une option
mais ça marche pas :'(
 

Code :
  1. void ajout_underscore(char remplacement, int longueurmax)
  2. {
  3.     int i;
  4.     extern char chainecar[255];
  5.     scanf( "%[^?;,.\n][ a-zA-Z-]20c", chainecar );   // %[^1-9?;,.\n] pas de ponctuation normale autorisée
  6.                                                      // %[ a-zA-Z-] char  alphabetique, '-' et espace acceptés
  7.     // On fait un fflush
  8.     if (cclean=getchar() != '\n') while (getchar() != '\n');
  9.     for(i=0; chainecar[i]!='\0'; i++)
  10.       if (remplacement==' ') chainecar[i] = (chainecar[i] == ' ') ? '_' : chainecar[i];
  11.       if (remplacement=='_') chainecar[i] = (chainecar[i] == '_') ? ' ' : chainecar[i];
  12.     if (strlen(chainecar) > longueurmax)
  13.     {
  14.       printf("  **Saisie incorrecte, la taille est limitee a %d**\n\n",longueurmax);
  15.       taille=0;
  16.     }
  17.     else taille=1;
  18. }


 
il me sort : conflicting types alors que j'ai rien changé aux declarations
juste rajouté char remplacement qui n'existait pas avant
et ça fonctionnait :'(

n°707857
Taz
bisounours-codeur
Posté le 24-04-2004 à 22:14:49  profilanswer
 

le %c pour une chaine ... génial ...
 
moi dans ton cas, j'utiliserais toujours fgets + des trucs de string.h pour filtrer
 
parce que toute façon, avec ta pseudo regex tu l'a profond si scanf n'arrive à rien lire


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

  (C) Remplacer des espaces par des underscores

 

Sujets relatifs
[Dreamweaer Mx] : Pb d'espaces entre 'tableau de mise en forme'[Java] Remplacer une classe pdt l'execution
remplacer une checkbox par une image...remplacer dans un fichier texte
[PHP] Remplacer dans un texte des smileys par des tags <img ... /> ?[Regexp] Supprimer tous les espaces,\t,\n\r en dehors des balises
[CSS] des espaces entre mes DIV....[C] Remplacer une partie d'une chaîne de caractères
Remplacer du texte dans plusieurs documents Wordremplacer un mot dans une chaine par un autre mot
Plus de sujets relatifs à : (C) Remplacer des espaces par des underscores


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)