2012-10-26 71 views
5

提問here的問題與我遇到的問題非常相似。區別在於我必須將一個參數傳遞給一個刪除空格並返回結果字符串/字符數組的函數。我得到的代碼工作刪除空間,但由於某種原因,我剩下的原始數組遺留的字符。我甚至嘗試過strncpy,但是我有很多錯誤。從C中的字符串/字符數組中刪除空格的函數

這是我到目前爲止有:

#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

的可能的複製[如何刪除從C語言中給定的字符串的所有空格和跳?](http://stackoverflow.com/questions/1514660/how-to-remove-all-spaces-and - 從一個給定的字符串在C語言) –

回答

11

從你還沒有NUL終止符(\0),因爲新的長度小於或等於原字符串終止它的input去除空格後。

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

爲我工作很好!謝謝。必須將j聲明移出for循環才能賦予其功能範圍可見性。 –

10

你不是終止輸出,並且由於它可能已經今非昔比,你要離開老尾巴在那裏。

另外,我建議j的處理,它總是在循環中增加,然後必須手動遞減,如果當前字符未被複制,有些次優。這不是很清楚,而且它做的沒有意義的工作(遞增j),甚至在不需要時也不得不撤銷。非常混亂。

它很容易寫成:

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

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

    return out; 
} 
+0

我會更喜歡你的答案,但我只有一個嬰兒的指針的理解。我正在爲我的班級閱讀的這本書並沒有像我這樣的絕對初學者解釋得那麼好,我真的無法解釋我的老師究竟發生了什麼。如果我盯着你的代碼足夠長的時間,但我確實沒有關於你的代碼如何工作的基本概念,我可以把你做的事情拼湊在一起。例如,如何增加「++」與char數組一起工作?我認爲這隻能用於數字數據類型。無論如何感謝您的輸入! –

0

正如其他人所提到的,相同的字符串用於源和目標,和字符串的結束不維護:

就在年底的for循環您NUL,終止它。

你也可以用下面的方法做。

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

您可以選擇添加空(\ 0)終止後的for循環塊

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

如果您需要一次過濾多個字符,你可能會發現後返回字符串例如:

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

有用的;只需提供您希望刪除的*過濾器中的字符列表。例如「\ t \ n」,用於製表符,換行符和空格。

0

該代碼適用於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);