我已经实现了我自己的getline函数的动态内存版本:
char * fgetline(FILE * f)
以30个字符缓冲区开始,当缓冲区已满时,分配一个新的内容并释放旧缓冲区。当我们得到EOF
或\n
时,我们会从函数返回。
我想使用此函数来实现程序尾部的一个版本。输入来自stdin,输出转到stdout。如果第一个参数以-
开头,则-
之后的所有内容都是要打印的行数。当没有给出参数时,要打印的默认行数是10。
直到现在我才想到我应该使用这个功能:
int atoi (const char *s)
来自stdlib.h
并且有一系列指向行的指针,但我不确切知道如何执行此操作。
有什么想法吗?
答案 0 :(得分: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);
功能。不要忘记编译所有警告&amp;调试信息,例如在Linux上使用gcc -Wall -g
。使用调试器(Linux上为gdb
)来调试程序。考虑fopen
可能失败,并使用errno
显示相应的错误消息。
请注意,您不需要fgetline
功能。 getline(3) {{3}}
函数是标准函数(在Posix 2008中)并且是动态分配行缓冲区。