2012-10-26 24 views
5

Pytanie zadane here jest bardzo podobne do tego, z czym mam problem. Różnica polega na tym, że muszę przekazać argument do funkcji, która usuwa spacje i zwraca wynikową tablicę znaków/znaków. Mam kod działający w celu usunięcia spacji, ale z jakiegoś powodu pozostaję z pozostałymi znakami pozostałymi z oryginalnej tablicy. Próbowałem nawet strncpy, ale miałem mnóstwo błędów.Funkcja usuwania spacji z ciągu znaków/znaków w C

Oto co mam do tej pory:

#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

Możliwy duplikat [Jak usunąć wszystkie spacje i tabulatory z danego ciągu znaków w języku C?] (Http://stackoverflow.com/questions/1514660/how-to-remove-all-spaces-and -tabs-from-a-given-string-in-c-language) –

Odpowiedz

11

Po usunięciu spacji od input nie zostały zakończone go nul-terminator (\0), ponieważ nowa długość jest mniejsza lub równa oryginalnego łańcucha.

Wystarczy nul-zniesieniu go w końcu z Twojego pętli 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

Dobrze mi działało! Dzięki.Musiał przenieść j deklarację z pętli for, aby nadać jej widoczność w zakresie funkcji. –

10

Nie jesteś kończące wyjście, a ponieważ może to skurczyła, jesteś pozostawiając starą ogon tam.

Sugeruję również, że leczenie j, które zawsze jest inkrementowane w pętli, a następnie musi być zmniejszane ręcznie, jeśli bieżący znak nie jest kopiowany, jest nieco nieoptymalne. Nie jest to zbyt jasne i wykonuje bezcelową pracę (zwiększając j), która musi zostać cofnięta, gdy nie jest pożądana. Dość mylące.

Łatwiej zapisać jako:

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

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

    return out; 
} 
+0

Wolałbym twoją odpowiedź, ale mam tylko niemowlę rozumienie wskaźników. Książka, którą czytam dla mojej klasy, nie wyjaśnia tak dobrze dla absolutnie początkujących, jak ja, i szczerze nie mogłam wyjaśnić, co dzieje się z moim instruktorem. Mogę trochę złożyć to, co zrobiłeś, jeśli patrzę na twój kod wystarczająco długo, ale naprawdę nie mam podstawowej koncepcji, jak działa twój kod. Na przykład, w jaki sposób wzrasta "++" z tablicami char? Pomyślałem, że może być używane tylko dla liczbowych typów danych. Dziękujemy za twoje wejście! –

0

Jak inni wspomniano, ten sam łańcuch jest używany zarówno źródła i przeznaczenia, a koniec sznurka nie jest zachowana.

Możesz zrobić w następujący sposób również.

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

Trzeba zwrócić ciąg po dodaniu null (\ 0) terminator po za blokiem pętla

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

Jeśli trzeba filtrować więcej niż jeden znak naraz, możesz znaleźć coś w rodzaju:

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; 
} 

Przydatne; po prostu podaj listę znaków w * Filtrze, którego chcesz usunąć. Na przykład "\ t \ n" dla kart, znaków nowej linii i spacji.

0

Ten kod działa ze złożonością czasową 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); 
Powiązane problemy