【问题标题】:C: Reverse a file , line by lineC:逐行反转文件
【发布时间】:2017-06-23 01:40:28
【问题描述】:

我正在尝试使用递归逐行反转文件。所以基本上是一个输入。我正在寻找一种不使用任何指针或数组就可以开始的方法。如果你能指出我正确的方向,那就太好了。

dogs
cats

会有一个输出

sgod
stac

这是我的源代码到目前为止的样子,但我只是反转整个文本文件(通过命令行

#include <stdio.h>

void Recursion();
int main (int argc, char argv)
{
  Recursion();
  printf("\n");
}

void Recursion()
{
  int c;
  while((c = getchar()) != EOF)
    {
      Recursion(c);
      printf("%c",c);
    }
}

【问题讨论】:

  • 然后读取一行,反转它,读取下一行并反转它,然后读取下一行并反转它,....继续这样做,直到没有更多行可读取。如果您想阅读一行内容,请查找fgets
  • 这看起来very familiar,一直到括号中没有参数的错误函数原型......
  • 第一步是关闭你的电脑。接下来,拿起铅笔和纸,用文字解释解决问题所需的步骤。
  • 没有参数的声明可能不是这里的根本问题,但如果你有兴趣可以阅读 C herehere 的这个过时特性。

标签: c


【解决方案1】:

首先,您必须确保您的函数“递归”可以在一行中运行。您的函数“递归”可以这样声明:

//source must have pointed to storage space of the line and the 
//storage space of line must be not read-only. As we know "dogs" is  
// a constant value you can't change.

int Recursion(char *source,int length);

在递归中输入字符串“dogs”,输出必须是“sgod”。

然后,你可以读取文件的每一行,并将它们输入到这个函数 Recursion 中,这样你就可以得到你想要的结果。

我认为函数 Recursion 可能有错误,或者您无法从文件中读取行。如果你能给我关于函数递归或读取文件模块的详细代码,很容易找出错误。

您正在使用函数 getchar() 而不是从文件中读取行。所以'EOF'是不对的,应该是'\n'。您也不应该在递归中使用 while,因为它已经是一个递归函数。所以正确的代码如下:

void Recursion()
{
  int c;
  if((c = getchar()) != '\n')
  {
     Recursion(c);
     printf("%c",c);
  }
  else
     return;
}

我认为你的代码不好。在我看来,反转字符串的函数不需要递归,就像这样:

int Recursion(char *source,int length);

这样您就可以将程序分成单独的模块---读取行和反向。因此 main 函数就像这样:

int main()
{
    int fd = open();

    while(1)
    {
       // 1.read line
       ....
       //2. is EOF?
       break;
       //3. reverse line
       Recursion(line,strlen(line));
    }
}

希望对你有帮助。

【讨论】:

  • 函数Recursion()的代码就在问题帖中!
  • 在这个问题中,您没有从文件中读取字符串。所以函数应该是这样的。我已经修复了我的答案。
  • 程序正在从stdin读取,如果stdin已被重定向,则该文件可能是一个文件。
  • 我明白了。如果你想使用 EOF 标志,你应该按 Ctrl+D 在标准输入中生成 EOF。
  • 您可以从命令行重定向文件。在 Linux 中,使用./a.out &lt; input_file.txt 调用程序以使stdin 从文件中读取。
【解决方案2】:

如果你真的想用递归来做到这一点,那就这样做吧:

#include <stdio.h>

int recursion() {
    int c = getchar();
    if(c != '\n' && c != EOF) {
        int n = recursion();
        printf("%c", c);
        return n;
    } else {
        return c;
    }
}

int main (void) {
    while(recursion() != EOF) printf("\n");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2012-03-26
    • 2021-12-30
    相关资源
    最近更新 更多