0

可能重复:
我试图使此代码递归但由于某种原因它不起作用

我正在尝试使用 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;

}

4

3 回答 3

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

想法是你找到字符并将它们存储在一个字符串中,当你到达一个空间时,你存储第一个并忽略其余的。然后您可以再次将新字符串发送到该函数。并且您返回与新字符串连接的结果

PS 上面的代码可能无法编译,但它应该让您对如何处理这个问题有一个很好的了解。

稍微阐述一下:

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

于 2013-02-05T08:44:22.600 回答
0

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

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);
于 2013-02-05T09:54:32.123 回答
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)
于 2013-02-05T09:17:29.893 回答