-2

我已经实现了自己的动态内存版本的 getline 函数:

char * fgetline(FILE * f)

从 30 个字符的缓冲区开始,当缓冲区已满时分配一个新的缓冲区,复制内容并释放旧缓冲区。当我们从函数中获取EOF\n返回时。

我想用这个函数来实现程序tail的一个版本。输入来自标准输入,输出到标准输出。如果第一个参数以 开头-,则后面的所有内容都是-要打印的行数。当没有给出参数时,默认打印的行数是 10。

到目前为止,我一直认为我应该使用该功能:

int atoi (const char *s) 

fromstdlib.h并且有一个指向行的指针数组,但我不知道该怎么做。

有任何想法吗?

4

1 回答 1

1

将您的main功能声明为

 int main (int argc, char**argv) {
 }

如果您将程序编译为myprog可执行文件并调用它,myprog -20 somefile anotherfile那么您将拥有:

argc == 4 
&& strcmp(argv[0], "myprog") == 0
&& strcmp(argv[1], "-20") == 0
&& strcmp(argv[2], "somefile") == 0
&& strcmp(argv[3], "anotherfile") == 0
&& argv[4] == NULL

换句话说,您可能希望您的程序包含

int nblines = 10;

int main(int argc, char**argv) {
  int argix = 1;
  if (argc>1) {
    if (argv[1][0]=='-') 
      { 
         nblines = atoi(argv[1]+1);
         argix = 2;
      }
     for (; argix < argc; argix++)
        tail (argv[argix]);
  }
  return 0;
}

您可以适当地实现您的void tail(char*filename);功能。不要忘记编译所有警告和调试信息,例如gcc -Wall -g在 Linux 上。使用您的调试器(gdb在 Linux 上)调试您的程序。考虑到fopen可能会失败,并使用errno来显示适当的错误消息。

请注意,您不需要您的fgetline功能。getline(3)函数是标准的 (在 Posix 2008 中)并且动态分配行缓冲区。

于 2012-10-27T12:54:23.760 回答