(C) Remplacer des espaces par des underscores

Remplacer des espaces par des underscores (C) - C - Programmation

Marsh Posté le 21-04-2004 à 23:42:52    

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 !

Reply

Marsh Posté le 21-04-2004 à 23:42:52   

Reply

Marsh Posté le 21-04-2004 à 23:53:44    

1) utilise fgets
2) utilise memset

Reply

Marsh Posté le 22-04-2004 à 01:08:56    

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

Reply

Marsh Posté le 22-04-2004 à 01:40:31    

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
Reply

Marsh Posté le 23-04-2004 à 23:20:24    

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

Reply

Marsh Posté le 23-04-2004 à 23:23:24    

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

Reply

Marsh Posté le 24-04-2004 à 12:03:41    

plus simple :

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

Reply

Marsh Posté le 24-04-2004 à 12:25:57    

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.

Reply

Marsh Posté le 24-04-2004 à 12:38:48    

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
Reply

Marsh Posté le 24-04-2004 à 12:43:04    

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 ?

Reply

Marsh Posté le 24-04-2004 à 12:43:04   

Reply

Marsh Posté le 24-04-2004 à 12:45:58    

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
Reply

Marsh Posté le 24-04-2004 à 12:54:17    

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

Reply

Marsh Posté le 24-04-2004 à 12:59:23    

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

Reply

Marsh Posté le 24-04-2004 à 13:03:17    

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
Reply

Marsh Posté le 24-04-2004 à 13:06:30    

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

Reply

Marsh Posté le 24-04-2004 à 13:10:01    

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.

Reply

Marsh Posté le 24-04-2004 à 13:16:54    

Déjà vu.

Reply

Marsh Posté le 24-04-2004 à 22:05:55    

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 :'(

Reply

Marsh Posté le 24-04-2004 à 22:14:49    

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

Reply

Sujets relatifs:

Leave a Replay

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