如何摆脱字符串中的空格?

时间:2013-06-07 03:52:28

标签: c string

我正在尝试编写一个函数来删除字符串中的空格,我知道我的问题是即使将下一个字符移动到空格所在的位置后,我仍然会将该字符复制到其原始位置(我两次重复一个角色)。我不太确定如何摆脱那个重复的角色。 (即我有“Hello world。”,但我的功能给了我“Hellowworld。”)

void deblank(char str1[], char str2[])
{
   int i, x;

   for (i = 0; str1[i] != '\0'; i++)
   {
      if (str1[i] == ' ')
      {
         x = i + 1;
         str2[i] = str1[x];
      }

      else
      {
         str2[i] = str1[i];
      }
   }

   str2[i] = '\0';
}

7 个答案:

答案 0 :(得分:1)

目前,您只有一个索引i

你真的想要两个索引,称它们为iji将成为源字符串的索引。 j将成为目标字符串的索引。

您将首先浏览源代码字符串,就像现在一样,在每次迭代时递增i。如果源中包含非空格字符,则会将其复制到目标位置,并递增目标索引。

如果源中有空格,则不会将其复制到目标或增加目标索引。

通常情况如下:

size_t j = 0;

for (i=0; input[i]; i++)
    if (input[i] != ' ')
        output[j++] = input[i];
output[j] = '\0';

是的,我会使用inputoutputsourcedest代替str1str2。后者没有说明您要复制到哪个。

我还建议使用isspace中的<ctype.h>而不是直接与空格字符进行比较,除非您真的只想消除空格字符,但保留其他空格(制表符,回车符) ,新线,垂直标签等。)

答案 1 :(得分:1)

[edit]重写只使用1个字符串参数。

void deblank(char str[]) {
   size_t x = 0;
   for (size_t i = 0; str[i]; i++) {
      if (str[i] != ' ') {
         str[x++] = str[i];
      }
   }
   str[x] = '\0';
}

答案 2 :(得分:1)

好的,这只是为了接受已接受答案的替代方法,主要是帮助您以更通用的方式解决问题。

#include <stdio.h>
/** 
 * char *remove_needles(char *dest, const char *haystack, const char *needles);
 * 
 * puts in dest, all characters from haystack, that are not found in needles
 */

char *remove_needles(char *dest, const char *haystack, const char *needles) 
{
    const char *hp;   /* this pointer will run through the haystack and is used to sort
                       * needles and hay 
                       */
    char *dp;         /* this pointer will point to the last character in dest */
    const char *np;   /* runs through the needles with the current  */

    dp = dest;         /* to begin with the tail is the head :-) */

    for (hp = haystack; hp != NULL && *hp != '\0'; hp++ ) {

        for (np = needles; *np != '\0'; np++ ) {  
           if ( *hp == *np ) { /* is the current char at hp a needle? */
              break; /* yep: let's break out of this loop it's a needle */
           }
        }

        if ( *np == '\0' ) { 
                           /* *np will only be '\0' if we ran through all the needles but 
                            * the character at the pointer hp was not a needle
                            */
           *dp = *hp;      /* so it's hay and we save it at the tail of dest */
           dp++;           /* and move the tail along */
        }
    }

    return dest;           /* we are all done and we return the result */
}


int main() 
{
      char src[] = "Hello World\n\tare you watching this?";
      char dest[256]; /* this should have at least sizeof(src) space */
      char white_spaces[] = " \t"; /* these are our needles, notice the space before \t */

      remove_needles(dest, src, white_spaces);

      printf("src: `%s'\ndest:`%s'\n", src, dest);
      return 0;
}

要考虑的练习

  1. 你能将它扩展到一个拆分函数,它将来自haystack的子串放入一个数组中吗?首先将自己限制为10个子字符串,声明char dest[128][10];然后尝试一下。

  2. 你怎么能避免像这样声明这个?我们知道可以占用的总内存不会比干草堆大,是否有可能在不手动计算的情况下将自己压得接近这个数量?

答案 3 :(得分:0)

你只是移动1个角色并留下其余部分 - 用'w'填充''。

从左向右移动,每次遇到空白时都需要将所有字符移到左侧。无论如何,这是个主意。

拥有2个字符串会更容易 - 也更快一点:源和目的地。

像这样:

char src[128] = "hello world and then some!";
char dest[128];

int destIndex = 0;
for (int i = 0; i < strlen(src); ++i)
{
    if (src[i] != ' ')
        dest[destIndex++] = src[i];
}
dest[destIndex] = 0;  // make sure the new string is terminated

这样你就不必移动任何东西 - 只需将非空白字符移动到新字符串中,然后留下一个删除了所有空格的新字符串。

答案 4 :(得分:0)

code what ur written won't work when multiple spaces are there in between words.


int i, x=0;

   for (i = 0; str1[i] != '\0'; i++)
   {
      if ((str1[i] == ' ')||(str[i] == '\t'))
      {
         continue;
      }

      else
      {
         str2[x] = str1[i];
          x++;
      }
   }

   str2[x] = '\0';

答案 5 :(得分:0)

这应该有效。

void deblank(char str1[], char str2[])
{
   int i, j;

   for (i = 0, j = 0; str1[i] != '\0'; i++, j++)
   {
      if (str1[i] == ' ')
      {
         i++;
         str2[j] = str1[i];
      }

      else
      {
         str2[j] = str1[i];
      }
   }

   str2[j] = '\0';
}

答案 6 :(得分:0)

更智能的方法是使用第二个计数器来跟踪输出数组中的当前位置。如果输入中的当前字符不是空格,则只复制到输出。

#include <stdio.h>

void deblank(char str1[], char str2[])
{
   int i, j = 0; /* j points initially to the first element of str2, we only increment it if i doesn't point to space */

   for (i = 0; str1[i] != '\0'; i++)
   {
      if (str1[i] != ' ') /* i doesn't point to a space char */
      {
         str2[j] = str1[i]; /* add the current char to str2, for the first iteration this is at position str2[0] */
         j++; /* increment j++, so that the next time we encounter a non-space char, it is put in the next posisition */
      }
   }

   str2[i] = '\0';
}

int main()
{
    char input[20] = "Hey lo, World!";
    char output[20] = "";

    deblank(input, output);

    printf("%s - %s\n", input, output);

    return 0;
}

打印:

 $ ./a.out 
 Hey lo, World! - Heylo,World!