2009-11-14 6 views
0

j'ai écrit cette fonction:Comment remplacer les espaces et tabulations avec rien dans C?

void r_tabs_spaces(char *input) { 
     int i; 
     for (i = 0; i < strlen(input); i++) 
     { 
     if (input[i] == ' ' || input[i] == '\t') 
        input[i] = ''; 
     } 
} 

Cependant, lorsque je compile cela et lance, le compilateur se plaint que « erreur: caractère vide constant » à la ligne où j'essaie d'entrer [i] = « »;

Comment puis-je faire cela en C alors?

+0

commentaire Per OP ci-dessous, cette question est une copie exacte de http://stackoverflow.com/questions/122616/painless-way- to-trim-leading-trailing-white-in-c –

+0

Trébuché sur ce post et ne pouvait s'empêcher de remarquer que "remplacer avec rien" revient à supprimer. :) – Arjan

Répondre

8

En C, une chaîne est un tableau d'octets. Vous ne pouvez pas affecter un "octet vide", mais vous devez déplacer le reste des octets vers l'avant.

est ici une façon de comment faire:

char *write = str, *read = str; 
do { 
    // Skip space and tab 
    if (*read != ' ' && *read != '\t') 
     *(write++) = *read; 
} while (*(read++)); 

Rappelez-vous que des chaînes dans C sont généralement en mémoire protégée en écriture, de sorte que vous devez copier sur le tas avant de pouvoir les changer. Par exemple, cette segfaults habituellement:

char *str = "hello world!"; // Literal string 
str[0] = 'H'; // Segfault 

Vous pouvez copier une chaîne dans le tas avec strdup (entre autres):

char *str = strdup("hello world!"); // Copy string to heap 
str[0] = 'H'; // Works 

EDIT: Par votre commentaire, vous pouvez sauter seulement initiale des espaces en se souvenant le fait que vous avez vu un personnage non-espace. Par exemple:

char *write = str, *read = str; 
do { 
    // Skip space and tab if we haven't copied anything yet 
    if (write != str || (*read != ' ' && *read != '\t')) {  
     *(write++) = *read; 
    } 
} while (*(read++)); 
+0

... et n'oubliez pas de prendre soin des octets de queue restants. S'ils sont alloués dynamiquement, relâchez-les. – Dmitry

+0

Oh, j'ai oublié d'ajouter une chose. Je n'ai besoin de supprimer que les espaces et les onglets principaux, mais si une chaîne les a entre les caractères, je dois les laisser tels quels. Ils ci-dessus solution fonctionne bien mais il supprime tous. Comment puis-je laisser ceux qui sont entre les caractères? – goe

+0

N'oubliez pas que '' définit des macros utiles, et break peut quitter les boucles plus tôt. –

0

La façon de supprimer un caractère d'une chaîne est de déplacer le reste de la chaîne d'un caractère.

1

Si vous avez un pointeur sur la chaîne

"   string with leading spaces" 
^ pointer 

déplacer juste ...

"   string with leading spaces" 
      ^pointer 

par exemple:

#include <ctype.h> 
/* ... */ 
char mystring[] = "   string with leading spaces"; 
char *pointer = mystring; 
while (*pointer && isspace((unsigned char)*pointer)) ++pointer; 
/* pointer now points to a (possibly empty) string with no leading spaces */ 
+0

+1 N'a même pas besoin que la chaîne soit sur le tas :) – Andomar

0

utilisation

foo += strspn(foo, " \t"); 

pour déplacer le pointeur foo vers le premier caractère qui n'est pas un espace ou un onglet.

Pour supprimer réellement les caractères d'une chaîne allouée dynamiquement, utilisez

size_t offset = strspn(foo, " \t"); 
size_t size = strlen(foo + offset) + 1; 
foo = realloc(memmove(foo, foo + offset, size), size); 
Questions connexes