2010-10-28 5 views
0

pouvez-vous me donner un exemple de suppression de caractères d'un tableau de caractères dans c? J'ai essayé trop, mais je n'a pas atteint ce que je veuxComment faire pour supprimer un caractère d'une chaîne en utilisant baskspace en C?

Ce que j'ai fait:

int i; 
if(c<max && c>start) // c is the current index, start == 0 as the index of the start, 
         //max is the size of the array 
{ 
       i = c; 
     if(c == start) 
         break; 

     arr[c-1] = arr[c]; 


} 
printf("%c",arr[c]); 
+2

Pouvez-vous changer le titre? Vous ne parlez pas des événements d'entrée utilisateur ... peut-être quelque chose comme "Comment supprimer une sous-chaîne d'une chaîne en C?" – andrewmu

+0

Cela ne fonctionne pas, vous avez besoin d'une boucle for ou memmove. En termes de complexité, cela doit être O (n). –

+0

@andrewmu ok, changé comme vous le suggérez – noor

Répondre

4

Un tableau de caractères en C ne permet pas facilement supprimer des entrées. Tout ce que vous pouvez faire est de déplacer les données (par exemple en utilisant memmove). Exemple:

char string[20] = "strring"; 
/* delete the duplicate r*/ 
int duppos=3; 
memmove(string+duppos, string+duppos+1, strlen(string)-duppos); 
1

Vous avez un tableau de caractères c:

char c[] = "abcDELETEdefg"; 

Vous voulez un tableau différent qui ne contient que "abcdefg" (plus le terminateur null). Vous pouvez le faire:

#define PUT_INTO 3 
#define TAKE_FROM 9 
int put, take; 
for (put = START_CUT, take = END_CUT; c[take] != '\0'; put++, take++) 
{ 
    c[put] = c[take]; 
} 
c[put] = '\0'; 

Il existe des moyens plus efficaces de le faire en utilisant memcpy ou memmove, et il pourrait être plus générale, mais cela est l'essence. Si vous vous souciez vraiment de la vitesse, vous devriez probablement faire un nouveau tableau qui ne contient pas les caractères que vous ne voulez pas.

1

Voici une approche. Au lieu de supprimer les caractères en place et brouiller les caractères restants (qui est une douleur), vous copiez les caractères que vous souhaitez conserver à un autre tableau:

#include <string.h> 
... 
void removeSubstr(const char *src, const char *substr, char *target) 
{ 
    /** 
    * Use the strstr() library function to find the beginning of 
    * the substring in src; if the substring is not present, 
    * strstr returns NULL. 
    */ 
    char *start = strstr(src, substr); 
    if (start) 
    { 
    /** 
    * Copy characters from src up to the location of the substring 
    */ 
    while (src != start) *target++ = *src++; 
    /** 
    * Skip over the substring 
    */ 
    src += strlen(substr); 
    } 
    /** 
    * Copy the remaining characters to the target, including 0 terminator 
    */ 
    while ((*target++ = *src++)) 
    ; // empty loop body; 
} 

int main(void) 
{ 
    char *src = "This is NOT a test"; 
    char *sub = "NOT "; 
    char result[20]; 
    removeSubstr(src, sub, result); 
    printf("Src: \"%s\", Substr: \"%s\", Result: \"%s\"\n", src, sub, result); 
    return 0; 
} 
0

string = BONJOUR \ 0

string_length = 5 (ou tout simplement utiliser strlen à l'intérieur si vous ne voulez pas mettre en cache en dehors de cet appel

remove_char_at_index = 1 si vous voulez supprimer le « E »

copie à la position « E » (string + 1)

de la première position 'L' (string + 1 + 1)

4 octets (voulez obtenir le NULL), donc 5 - 1 = 4

remove_character_at_location(char * string, int string_length, int remove_char_at_index) { 

    /* Use memmove because the locations overlap */. 

    memmove(string+remove_char_at_index, 
      string+remove_char_at_index+1, 
      string_length - remove_char_at_position); 

} 
Questions connexes