函数从字符串/char数组中删除空格。

时间:2021-06-15 21:42:03

The question asked here is very similar to what I am having a problem with. The difference is that I must pass an argument to a function that removes the spaces and returns the resulting string/char array. I got the code working to remove the spaces but for some reason I am left with trailing characters left over from the original array. I even tried strncpy but I was having lots of errors.

这里提出的问题与我的问题非常相似。区别在于,我必须将一个参数传递给一个函数,该函数删除空格并返回结果字符串/char数组。我得到了删除空格的代码,但由于某些原因,我留下了原始数组中遗留的拖尾字符。我甚至尝试过strncpy,但是我有很多错误。

Here is what I have so far:

以下是我目前所拥有的:

#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*/
    }
}

6 个解决方案

#1


12  

After removing the white spaces from the input you have not terminated it with nul-terminator (\0) because the new length is less than or equal to the original string.

在从输入中删除空白后,您没有终止它与nul-terminator(\0),因为新长度小于或等于原始字符串。

Just nul-terminate it at the of end your for loop:

在结束时,你的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;
}

#2


11  

You're not terminating the output, and since it might have shrunk, you're leaving the old tail in there.

你不会终止输出,因为它可能会缩小,所以你会把旧的尾部留在那里。

Also, I would suggest that the treatment of j, which is always incremented in the loop and then has to be manually decremented if the current character is not copied, to be somewhat sub-optimal. It's not very clear, and it's doing pointless work (incrementing j) which even has to be undone when it's not desired. Quite confusing.

另外,我建议对j的处理,它总是在循环中增加,如果当前的字符没有被复制,那么必须手工递减,以达到某种次优。它不是很清楚,它在做毫无意义的工作(增加j),甚至在不需要的时候也要被撤销。很让人困惑。

It's easier written as:

这是更容易写成:

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

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

  return out;
}

#3


0  

As others mentioned, same string is used for both source and destination, and a end of string is not maintained.

正如前面提到的,源和目的地都使用相同的字符串,而字符串的结束也没有得到维护。

You could do in the following way also.

你也可以这样做。

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*/
}

#4


0  

You have to return the string after adding the null(\0) terminator after the for loop block

在为for循环块添加null(\0)结束符后,必须返回字符串。

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

#5


0  

If you need to filter more than one character at a time, you might find something like:

如果您需要一次过滤多个字符,您可能会发现:

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

Useful; just provide a list of characters in *Filter you wish to strip out. For example "\t\n ", for tabs, newlines and spaces.

有用的;只要提供一个你想去掉的过滤器中的字符列表。例如“\t\n”,用于制表符、换行符和空格。

#6


0  

This code works with time complexity of O(n).

该代码与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);

#1


12  

After removing the white spaces from the input you have not terminated it with nul-terminator (\0) because the new length is less than or equal to the original string.

在从输入中删除空白后,您没有终止它与nul-terminator(\0),因为新长度小于或等于原始字符串。

Just nul-terminate it at the of end your for loop:

在结束时,你的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;
}

#2


11  

You're not terminating the output, and since it might have shrunk, you're leaving the old tail in there.

你不会终止输出,因为它可能会缩小,所以你会把旧的尾部留在那里。

Also, I would suggest that the treatment of j, which is always incremented in the loop and then has to be manually decremented if the current character is not copied, to be somewhat sub-optimal. It's not very clear, and it's doing pointless work (incrementing j) which even has to be undone when it's not desired. Quite confusing.

另外,我建议对j的处理,它总是在循环中增加,如果当前的字符没有被复制,那么必须手工递减,以达到某种次优。它不是很清楚,它在做毫无意义的工作(增加j),甚至在不需要的时候也要被撤销。很让人困惑。

It's easier written as:

这是更容易写成:

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

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

  return out;
}

#3


0  

As others mentioned, same string is used for both source and destination, and a end of string is not maintained.

正如前面提到的,源和目的地都使用相同的字符串,而字符串的结束也没有得到维护。

You could do in the following way also.

你也可以这样做。

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*/
}

#4


0  

You have to return the string after adding the null(\0) terminator after the for loop block

在为for循环块添加null(\0)结束符后,必须返回字符串。

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

#5


0  

If you need to filter more than one character at a time, you might find something like:

如果您需要一次过滤多个字符,您可能会发现:

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

Useful; just provide a list of characters in *Filter you wish to strip out. For example "\t\n ", for tabs, newlines and spaces.

有用的;只要提供一个你想去掉的过滤器中的字符列表。例如“\t\n”,用于制表符、换行符和空格。

#6


0  

This code works with time complexity of O(n).

该代码与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);