【问题标题】:Function and strings函数和字符串
【发布时间】:2019-03-12 20:32:14
【问题描述】:

我是 C 新手,已经开始学习字符串。我想创建一个名为

的函数
void SpaceRemover(char *input )

它应该从给定的具有大量空间的字符串数组中删除间隔

到目前为止,我生成的代码删除了所有空格,并且没有提供我正在寻找的输出。谁能帮我这个?

char* SpaceRemover(char *input){
    char *output=input;
    for (int i = 0, j = 0; i<strlen(input); i++,j++)
    {
        if (input[i]!=' ')   
            output[j]=input[i]; 
        else
            j--;   
     }
     return output;
}

我做了这个,但我知道它错了,没有做我想做的事,但老实说,这就是我所能做的-_-

【问题讨论】:

  • 如果您向我们展示了您的代码以及您使用它得到的结果,我们可能会看一下并尝试找出它有什么问题。
  • 发布你的代码!一种解决方案可能是一个标志来指示您是否刚刚添加了一个空格(这样您就不会添加两个连续的空格)。但是如果没有您的代码,很难说出这样的标志方法将如何适应。
  • 这甚至不应该编译,你的函数被声明为不返回任何东西,但你试图返回一个char*
  • 您的原型的返回类型与您的实现不同。请修改。
  • 当您想要修剪前导空格、压缩包含空格并删除尾随空格时,乐趣就开始了。 (例如" david smith "

标签: c arrays string function if-statement


【解决方案1】:

你可以这样做

void SpaceRemover(char *name)
{
  int i=0,j=0;

  for (i = 0;i<strlen(name);i++)
   {
           if (name[i] != ' ' || (name[i] == ' ' && name[i+1] != ' ' && j!= 0))
           {
                   name[j++] = name[i];
           }
  }
  name[j]='\0'; //Terminate the string to avoid junk chars 
}

在哪里

if (name[i] != ' ' || (name[i] == ' ' && name[i+1] != ' ' && j != 0))

仅当当前字符不是空格或当前字符是空格且下一个字符不是空格时才允许复制(在开头包含单个空格)。

也不要忘记终止string

name[j]='\0';

【讨论】:

    【解决方案2】:

    问题是您删除了所有空格。

    char *SpaceRemover(char *name){
      char *output = name;
      int j = 0;
    
      for (int i = 0; i < strlen(name); i++) {
        if (name[i] != ' ' || (name[i] == ' ' && name[i + 1] != ' ') {  
          output[j] = name[i];
          j += 1; 
        }
      }
      output[j] = '\0'
      return output;
      }
    

    这个条件应该让一个空格通过。
    你可能会注意到我用char * 替换了void 返回类型,这样就可以使用你需要使用的函数了:

    name = SpaceRemover(name);
    

    【讨论】:

    • 嘿,我尝试了你所说的,但是当我使用给定的输入调用我的函数时,我得到如下信息:name = [ david smith (6 个空格,然后是 smith)].... 他们是最后有额外的史密斯?你能解释一下这背后的原因吗?
    • for 循环被for 循环语句修改时,在循环中执行j-- 是一种不好的做法。
    • @Comte_Zero,在这种情况下,只需将其作为“注释”添加到您的答案中。
    • 这个name != ' ' 做什么?
    • 我的意思很清楚,如果您要从一开始就删除空格,然后全部删除,不要只保留一个空格。
    【解决方案3】:

    我会在遇到空格时使用标志来激活。

    如果您还想删除前导和尾随空格,则可能需要对此进行调整。

    将在输出中添加一个空格,并使用该标志来避免添加下一个。当遇到除空格以外的其他内容时,该标志将被停用。

    正如 cmets 中的 Alex 所说,不建议在循环中递减 j 而在 for 语句中递增。

    我会复制 for 循环中的每个字符,而不是过滤预先复制的输出。

    char space_found = 0;
    char *output = malloc(sizeof(char) * (strlen(name) + 1));
    int j = 0;
    for (int i = 0; i < strlen(name); ++i)
    {
        if (name[i] == ' ' and space_found == 0)
        {
            space_found = 1;
            output[j++] = name[i];
        }
        if (name[i] != ' ')
        {
            space_found = 0;
            output[j++] = name[i];
        }
    }
    output[j] = '\0';
    

    【讨论】:

    • 该标志是个好主意,但 OP 想要就地删除,逻辑结构也可以使用一些改进/缩短。
    • OT:关于:char *output = malloc(sizeof(char) * (strlen(name) + 1)); 1) 表达式:sizeof(char) 在 C 标准中定义为 1 将任何内容乘以 1 没有任何效果,只会使代码混乱。建议删除该表达式。 2) 始终检查 (!=NULL) 返回值以确保操作成功
    【解决方案4】:
    void spaceRemover(char* str)
    {
        char temp[50] = {0};
        int j = 0; 
        strncpy(temp, str, strlen(str) + 1);
        for(int i = 0; i < strlen(str); i++)
        {
            if(temp[i] != ' ')
            {
                str[j] = temp[i];
                j++;
            }   
        }
        str[j] = 0;
    }
    

    如果您有任何问题,请随时提问,祝您好运

    【讨论】:

      【解决方案5】:
      #include <stdio.h>
      
      char *rem(char *str)
      {
         char *cur=str;
         char *nex=str;
      
         while(*nex)
         {
            if(*nex == ' ') nex++;
            else *cur++ = *nex++;
         }
         *cur=0;
         return str;
      }
      
      int main(void) {
          char z[]=" etc def etc    def ";
          printf("%s\n", rem(z));
          return 0;
      }
      

      【讨论】:

      • OPs 的问题不是说要在单词之间保留 1 个空格,但不是在开头也不是结尾?
      • @user3629249 在哪里?
      猜你喜欢
      • 2021-10-28
      • 2012-07-16
      • 2020-08-24
      • 2015-04-02
      • 1970-01-01
      • 2011-12-30
      • 2019-04-24
      • 2018-01-16
      相关资源
      最近更新 更多