将多个空格更改为一个空格的递归形式

时间:2013-02-05 08:16:41

标签: c

  

可能重复:
  Im trying to make this code recursive but for some reason it doesnt work

我试图使用RECURSION编写程序将多个空格更改为一个空格可以有人帮忙吗? 例子" a _______ b"更改为" a_b" 这是我试图做了很长时间的任务!有人可以帮忙吗?

这里我尝试了这个,但我认为设计不适用于递归

void text_r(char *str)
{
    char *dst = str;

            if(*str=='\0')return ;
            *dst++ = *str;
            if (isspace(*str)) {
                    do ++str; while (isspace(*str));
                    --str;
            }
          return text_r(str++);
} 

我编写的代码没有递归,但我在转换它时遇到了问题

void compress_spaces(char * str) {         char * dst = str;

    for (; *str; ++str) {
            *dst++ = *str;
            if (isspace(*str)) {
                    do ++str; while (isspace(*str));
                    --str;
            }
    }
    *dst = 0;

}

3 个答案:

答案 0 :(得分:0)

不是最好的方法,但可以尝试这些方法

char* remove_space(char *str)
{
    char *dst = str;

    while(*str!=' ' ||*str !='\0')
        *dst++ = *str;
    if (isspace(*str)) {
            do ++str; while (isspace(*str));
            --str;
    }
  return strcat(dst,remove_space(str++));
}

想法是你找到角色并将它们存储在一个字符串中,当你到达一个空间时,你存储第一个并忽略其余部分。然后,您可以再次将新字符串发送到该函数。然后返回用新字符串

连接的结果

P.S。可能上面的代码不会编译,但它应该让你知道如何处理它。

详细说明:

创建一个将所有字符保存到空格的函数,然后忽略所有连续的空格,并将剩余的字符串发送给返回干净字符串的函数。然后它连接两个字符串以形成一个更大的干净字符串。

答案 1 :(得分:0)

这是我的实施。我通过保留最后一个空格字符替换多个空格的每个波段,并在找到非空格字符时删除该波段

void reduce(String s, int curIndex, int lastSpaceIndex)
    if (lastSpaceIndex != -1)
        if s[curIndex] is not a space
            then replace substring from s[lastSpaceIndex, curIndex-1] by a space
        else
            reduce(s, curIndex+1, lastSpaceIndex);
    else
        if s[curIndex] is not a space
            then reduce(s, curIndex+1, -1)
        else
            reduce(s, curIndex+1, curIndex)

答案 2 :(得分:0)

使用相同指针的递归版本(避免任何迭代部分,如),给出两次参数

void recur(char *str, char *out) {
  if (*str!=' ' || str[1]!=' ') *out++ = *str;
  if (*str) recur(str+1, out);
}

只有一个参数的递归版

void recur(char *str) {
  static char *out = NULL;
  if (out == NULL) out = str;
  if (*str!=' ' || str[1]!=' ') *out++ = *str;
  if (*str) recur(str+1);
}

迭代版

void iter(char *str) {
  char *out = str;
  do {
    if (*str!=' ' || str[1]!=' ') *out++ = *str;
  } while (*str++);
}

被称为

  char str[] = "   abc  d e  f   ";
  // either recursive
  recur(str, str);
  // or iterative
  iter(str);