我已经完成了作业(是的,这是针对编程课的),但恐怕我没有以最有效的方式去做。它基本上是 uniq 程序,它将比较文件中的相邻行,并且只打印任何重复行的副本。一些注意事项:printUniq() 是我自己的函数,它考虑了各种标志,readline() 是另一个函数,它使用 malloc 和 realloc 将任意长度的行读取到 char * 缓冲区中。这是我担心的部分:
if(prevline != NULL)
{
while(thisline != NULL)
{
while(thisline != NULL && strcmp(prevline, thisline) == 0)
{
count++;
free(prevline);
prevline = thisline;
thisline = readline(stream);
}
printUniq(prevline, cflag, dflag, uflag, count);
count = 1;
free(prevline);
if (thisline != NULL)
{
prevline = thisline;
if((thisline = readline(stream)) == NULL)
{
printUniq(prevline, cflag, dflag, uflag, count);
}
}
}
有没有更好的方法来构建这个程序?我讨厌必须在循环中检查此行的 NULL 三次。外部 while 循环中的第一次 NULL 检查是必要的,如果最后几行重复,则需要嵌套 while 中的下一次检查。调用 free 后的下一次检查主要检查“重复循环”是否因为 thisline 为空而退出,如果不是,它将允许程序获取另一行。然后下一个检查只针对文件中的最后一行,因为如果它不存在,当 readline 返回 null 时(文件中没有更多行),循环退出并且 prevline 永远不会打印。
无论如何,任何帮助表示赞赏。