从字符串中删除空格

时间:2011-03-31 14:32:00

标签: c

我尝试make程序从字符串中删除空格。 有人可以帮我吗?

int main()
{
    char str[15];
    int i=0;
    gets(str);
    while(str[i] !=0){
        if(str[i] == 32)
        {
            str[i++] = str[i];
            str[i] = str[i++];
        }
    }
    str[strlen(i)] = '\0';
    printf("%s", str);
    return 0;
}

THX

5 个答案:

答案 0 :(得分:3)

好吧,因为你正在使用C trim不是一个选择。 首先,你对这条线的看法是什么: str [i] = str [i ++]; ? 这基本上是一样的 我++;

现在代码:

 char *mystring, *read, *write;
 // mystring gehts filled with a null terminated string here
 read = mystring;
 write = mystring;
 while(*read != '\0') {
      if(*read == ' ') 
           read++;
      else 
           *write++ = *read++;
 }
 *write = '\0';

如果您想写入另一个String,只需将写入指向您想要的位置即可。别忘了检查你有足够的空间;)

答案 1 :(得分:1)

你可以使用2个指针。我不熟悉C,所以我想检查str [i] == 0表示字符串的结尾。

int main()
{
    char str[15];
    int i=0;
    int j=0;
    gets(str);
    while(str[i] !=0 && str[j] !=0){
        while(str[j] == 32)
        {
            j++;
        }
        if ( str[j] ==0){
            break;
        }
        str[i] = str[j];
        i++;
    }
    str[strlen(i)] = '\0';
    printf("%s", str);
    return 0;
}

答案 2 :(得分:1)

几个问题:

  1. 永远不会永远不会使用gets。首先,它从C99开始被弃用,并且将从标准的下一版本中消失。其次,在您的代码中引入一个失败点(不是可能介绍,介绍)。而不是gets(str),而是使用fgets(str, sizeof str, stdin)

  2. 使用字符常量而不是数字值,因为全世界都不是ASCII:

    if (str[i] == ' ') // not str[i] == 32
    

  3. 空格包括标签,换页,退货等,而不仅仅是空格;而不是检查单个值,使用isspace()库函数。

  4. 以下几行是个问题:

    
    str[i++] = str[i];
    str[i] = str[i++];
    
    
    首先,这应该调用未定义的行为;您试图在序列点之间多次读取和更新对象。其次,我不确定逻辑。看起来你正在尝试交换元素,而不是仅仅跳过一个元素。

  5. 您将整数值传递给strlen:这不会起作用。它会将整数值解释为一个地址(你至少应该得到一个警告),结果可能很糟糕。

  6. 您可以在具有两个数组索引的单个循环中执行此操作:

    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
      char str[15];
    
      if (fgets(str, sizeof str, stdin) != NULL)
      {
        size_t r, w;
    
        printf("Original: \"%s\"\n", str);
    
        /**
         * str[r] is the element that we are reading; str[w]
         * is the element that we are writing
         */
        for (r = 0, w = 0; str[r] != 0; r++)
        {
          if (!isspace(str[r]))   // if str[r] is not a whitespace character
            str[w++] = str[r];    // write it to str[w]; note that we only
                                  // advance w for non-whitespace chars
        }
        str[w] = 0; // add the 0 terminator at the end
    
        printf("Stripped: \"%s\"\n", str);
      }
      return 0;
    }
    

    显然,这会改变原始字符串。如果由于某种原因需要保留原始输入,则必须声明第二个缓冲区来保存修改后的字符串。

答案 3 :(得分:0)

你打算在这个条件下发生什么?

  if(str[i] == 32)
        {
            str[i++] = str[i];
            str[i] = str[i++];
        }

实际发生了什么? (提示:重读i ++上的部分)

- 皮特

答案 4 :(得分:0)

此代码速度快,工作正常..希望这对您的案例有所帮助..复制并粘贴到文件中并对其进行测试..

#include <stdio.h>
main()
{
    char str[100];
    int len = 0;
    gets(str);
    len = strlen(str);
    int i = 0;
    while(str[i]!='\0')
    {
        if(str[i] == ' ')
        {
            memcpy(&str[i], &str[i+1], len - i);
            len--;
        }
        i++;
    }
    str[len] = '\0';
    printf("O/P : %s\n",str);
}

这很好..

相关问题