2012-10-26 9 views
5

La domanda posta here è molto simile a quello con cui sto avendo un problema. La differenza è che devo passare un argomento a una funzione che rimuove gli spazi e restituisce la stringa risultante/array di caratteri. Ho ottenuto il codice di lavoro per rimuovere gli spazi, ma per qualche motivo sono rimasto con caratteri finali rimasti dalla matrice originale. Ho anche provato strncpy ma stavo avendo un sacco di errori.Funzione per rimuovere spazi da string/char array in C

Ecco quello che ho finora:

#include <stdio.h> 
#include <string.h> 
#define STRINGMAX 1000              /*Maximium input size is 1000 characters*/ 

char* deblank(char* input)             /* deblank accepts a char[] argument and returns a char[] */ 
{ 
    char *output=input; 
    for (int i = 0, j = 0; i<strlen(input); i++,j++)      /* Evaluate each character in the input */ 
    { 
     if (input[i]!=' ')             /* If the character is not a space */ 
      output[j]=input[i];            /* Copy that character to the output char[] */ 
     else 
      j--;               /* If it is a space then do not increment the output index (j), the next non-space will be entered at the current index */ 
    } 
    return output;               /* Return output char[]. Should have no spaces*/ 
} 
int main(void) { 
    char input[STRINGMAX]; 
    char terminate[] = "END\n";            /* Sentinal value to exit program */ 

    printf("STRING DE-BLANKER\n"); 
    printf("Please enter a string up to 1000 characters.\n> "); 
    fgets(input, STRINGMAX, stdin);           /* Read up to 1000 characters from stdin */ 

    while (strcmp(input, terminate) != 0)         /* Check for que to exit! */ 
    { 
     input[strlen(input) - 1] = '\0'; 
     printf("You typed: \"%s\"\n",input);        /* Prints the original input */ 
     printf("Your new string is: %s\n", deblank(input));     /* Prints the output from deblank(input) should have no spaces... DE-BLANKED!!! */ 

     printf("Please enter a string up to 1000 characters.\n> "); 
     fgets(input, STRINGMAX, stdin);          /* Read up to another 1000 characters from stdin... will continue until 'END' is entered*/ 
    } 
} 
+0

Eventuali duplicati di [Come rimuovere tutti gli spazi e le schede da una stringa in linguaggio C?] (Http://stackoverflow.com/questions/1514660/how-to-remove-all-spaces-and -tabs-from-a-given-string-in-c-language) –

risposta

11

Dopo aver rimosso gli spazi bianchi dal input non si è terminato con nul-terminator (\0), perché la nuova lunghezza è inferiore o uguale alla stringa originale.

Proprio nul-porvi fine alla fine il vostro di ciclo for:

char* deblank(char* input)           
{ 
    int i,j; 
    char *output=input; 
    for (i = 0, j = 0; i<strlen(input); i++,j++)   
    { 
     if (input[i]!=' ')       
      output[j]=input[i];      
     else 
      j--;          
    } 
    output[j]=0; 
    return output; 
} 
+0

ha funzionato bene per me! Grazie.Dovevo spostare j dichiarazione fuori dal ciclo for per dare visibilità alla visibilità della funzione. –

10

Lei non è che chiude l'uscita, e dal momento che potrebbe essere ridotto, si sta lasciando il vecchio coda in là.

Inoltre, suggerirei che il trattamento di j, che viene sempre incrementato nel ciclo e quindi debba essere decrementato manualmente se il carattere corrente non viene copiato, per essere alquanto sub-ottimale. Non è molto chiaro, e sta facendo un lavoro inutile (incrementando j) che deve essere annullato anche quando non lo si desidera. Abbastanza confusionario.

E 'più facile scritto come:

char * deblank(char *str) 
{ 
    char *out = str, *put = str; 

    for(; *str != '\0'; ++str) 
    { 
    if(*str != ' ') 
     *put++ = *str; 
    } 
    *put = '\0'; 

    return out; 
} 
+0

Avrei preferito la tua risposta, ma ho solo una comprensione infantile dei puntatori. Il libro che sto leggendo per la mia classe non spiega le cose così bene per i principianti assoluti come me e onestamente non so spiegare cosa sta succedendo al mio istruttore. Posso unire insieme ciò che hai fatto se fissavo il tuo codice abbastanza a lungo, ma in realtà non ho un concetto fondamentale di come funziona il tuo codice. Ad esempio, come funziona l'incremento di "++" con gli array di caratteri? Pensavo che potesse essere usato solo per i tipi di dati numerici. Grazie per il tuo contributo comunque! –

0

Come altri hanno detto, la stessa stringa viene utilizzato sia per origine e di destinazione, ed una fine della stringa non viene mantenuta.

Si potrebbe fare anche nel modo seguente.

char* deblank(char* input)             /* deblank accepts a char[] argument and returns a char[] */ 
{ 
    char *output; 
    output = malloc(strlen(input)+1); 

    int i=0, j=0; 
    for (i = 0, j = 0; i<strlen(input); i++,j++)      /* Evaluate each character in the input */ 
    { 
     if (input[i]!=' ')             /* If the character is not a space */ 
      output[j]=input[i];            /* Copy that character to the output char[] */ 
     else 
      j--;               /* If it is a space then do not increment the output index (j), the next non-space will be entered at the current index */ 
    } 

    output[j] ='\0'; 
    return output;               /* Return output char[]. Should have no spaces*/ 
} 
0

Bisogna restituire la stringa dopo aver aggiunto il null (\ 0) terminatore dopo il per il blocco del ciclo

char* deblank(char* input)             
{ 
char *output=input; 
for (int i = 0, j = 0; i<strlen(input); i++,j++)       
{ 
    if (input[i]!=' ')             
     output[j]=input[i];            
    else`enter code here` 
     j--;                
} 
output[j]='\0'; 
return output;               
} 
0

Se è necessario filtrare più di un carattere alla volta, si potrebbe trovare qualcosa come:

char *FilterChars(char *String,char *Filter){ 
    int a=0,i=0; 
    char *Filtered=(char *)malloc(strlen(String)*sizeof(char)); 
    for(a=0;String[a];a++) 
    if(!strchr(Filter,String[a])) 
     Filtered[i++]=String[a]; 
    Filtered[i]=0; 
    return Filtered; 
} 

Utile; è sufficiente fornire un elenco di caratteri in * Filtro che si desidera eliminare. Ad esempio "\ t \ n", per schede, nuove linee e spazi.

0

Questo codice funziona con la complessità temporale di O (n).

char str[]={"my name is Om"}; 
int c=0,j=0; 
while(str[c]!='\0'){ 
    if(str[c]!=' '){ 
     str[j++]=str[c]; 
    } 
    c++; 
} 
str[j]='\0'; 
printf("%s",str); 
Problemi correlati