2009-08-01 6 views
3

Eh bien, je suis à la recherche d'une fonction qui réduit plusieurs caractères d'espace ' ' dans une chaîne.Comment remplacer plusieurs espaces avec un seul espace?

Par exemple, pour la chaîne s donné:

s="hello__________world____!" 

La fonction doit retourner "hello_world_!"

En python, nous pouvons le faire via regexp simplement:

re.sub("\s+", " ", s); 
+1

Montrez ce que vous avez essayé jusqu'à présent. –

+0

Qu'avez-vous fait jusqu'ici pour essayer de résoudre ce problème? –

+0

je pensais à une fonction qui peut réduire les multispaces, mais cela ne fonctionne pas, peut-être pour le problème de récurrence –

Répondre

7

Une version qui modifie la chaîne en place, exécutez sur une copie si l'original doit être préservée:

void compress_spaces(char *str) 
{ 
    char *dst = str; 

    for (; *str; ++str) { 
     *dst++ = *str; 

     if (isspace(*str)) { 
      do ++str; 

      while (isspace(*str)); 

      --str; 
     } 
    } 

    *dst = 0; 
} 
+0

J'ai exécuté cette fonction mais si j'insère "Empty en quelque sorte" je recevrai 0 sortie! Je prétends que cela ne fait pas ce qu'il est censé faire ... –

+0

Fonctionne pour moi sur votre entrée. Je ne comprends pas ce que vous entendez par "recevoir 0 sortie". Je prétends que vous avez tort. ;-) – Idelic

+0

quand je compile cette déclaration et entrez un char * il supprimera tous les éléments, mon entrée était "Vide en quelque sorte" et le résultat était "" si littéralement vide, je serais heureux si vous me dites ce que je fais de mal :-) –

4

Il n'y a pas une telle fonction dans la bibliothèque standard C On doit écrire une fonction pour le faire ou utiliser une bibliothèque tierce.

La fonction suivante devrait faire l'affaire. Utilisez la chaîne source comme pointeur de destination pour effectuer l'opération en place. Sinon, assurez-vous que le tampon de destination est suffisamment dimensionné.

void 
simplifyWhitespace(char * dst, const char * src) 
{ 
    for (; *src; ++dst, ++src) { 
     *dst = *src; 
     if (isspace(*src)) 
      while (isspace(*(src + 1))) 
       ++src; 
    } 

    *dst = '\0'; 
} 
2
void remove_more_than_one_space(char *dest, char *src) 
{ 
    int i, y; 
    assert(dest && src); 
    for(i=0, y=0; src[i] != '\0'; i++, y++) { 
     if(src[i] == ' ' && src[i+1] == ' ') { 
      /* let's skip this copy and reduce the y index*/ 
      y--; 
      continue; 
     } 
     /* copy normally */ 
     dest[y] = src[i]; 
    } 
    dest[y] = '\0'; 
} 
int main() 
{ 
    char src[] = "Hello World ! !! !"; 
    char dest[strlen(src) + 1]; 
    remove_more_than_one_space(dest, src); 

    printf("%s\n", dest); 
} 

Je viens de faire cela, espère que cela aide.

+0

Mais l'appelant doit être sûr que dest pointe vers un bloc qui est plus grand que strlen (src) ou ce sera la mémoire trash . –

+0

Pourquoi plus grande? dest doit être * au moins * de la même taille que src. –

+0

strlen (src) je veux dire –

0

J'apprends juste C, donc je suis en utilisant le code beaucoup plus basique. Je suis en train de lire le premier chapitre de "Le langage de programmation C", et j'essayais de trouver la réponse à une tâche définie ici.

C'est ce que je suis venu avec:

#include <stdio.h> 

int main() 
{ 
    /* Set two integers: 
     c is the character being assessed, 
     lastspace is 1 if the lastcharacter was a space*/ 
    int c, lastspace; 
    lastspace = 0; 

    /* This while loop will exit if the character is EOF 

     The first "If block" is true if the character is not a space, 
     and just prints the character 
     It also tells us that the lastcharacter was not a space 

     The else block will run if the character is a space 

     Then the second IF block will run if the last character 
     was not also a space (and will print just one space) */ 

    while((c = getchar()) != EOF){ 
     if (c != ' '){ 
      putchar(c); 
      lastspace = 0; 
     } 
     else { 
      if (lastspace != 1) 
        putchar(c); 
      lastspace = 1; 
     } 
    } 

    return 0; 
} 

Hope that helps! Aussi, je suis bien conscient que ce code n'est peut-être pas optimisé, mais il devrait être simple pour un débutant comme moi de le comprendre!

Merci, Phil

0

une autre façon de le faire pour imprimer uniquement la première occurrence de l'espace jusqu'à ce que le caractère suivant vient, voici ma solution de force brute.

#include<stdio.h> 
typedef int bool; 
#define True 1 
#define False 0 
int main() 
{ 
     int t; 
     bool flag = False; 

     while ((t = getchar()) != EOF) 
       if (t == ' ' && !flag) 
       { 
         putchar(' '); 
         flag = True; // flag is true for the first occurence of space 
       } 

       else if(t == ' '&& flag) 
         continue; 
       else 
       { 
         putchar(t); 
         flag = False; 
       } 

     return 0; 
} 

espérons que cela aide.

1
#include<stdio.h> 
#include<string.h> 
#include<ctype.h> 
int main() 
{ 
    char word[100]; 
    gets(word); 
    //the word has more than a single space in between the words 
    int i=0,l,j; 
    l=strlen(word); 
    for (i=0;i<l;i++) 
    { 
     if(word[i]==' '&&word[i+1]==' ') 
     { 
      for(j=i+1;j<l;j++) 
      word[j]=word[j+1]; 
     } 
    } 
    puts(word); 
    return 0; 
} 

Ce code est très simple et a fonctionné comme un charme pour moi. Je ne sais pas si ce code aura d'autres problèmes que je n'ai pas rencontrés, mais pour l'instant cela fonctionne.

Questions connexes