如何仅使用命令行参数读取唯一行?

Posted

技术标签:

【中文标题】如何仅使用命令行参数读取唯一行?【英文标题】:How do I only read in unique lines using command-line arguments? 【发布时间】:2018-04-26 21:15:30 【问题描述】:

目前,我的 C 程序 alter.c 从使用命令行参数调用的文本文件中成功创建了一个字符数组 a。

但是,我想对其进行更改,使其不再读取每一行,而是仅读取前一行不连续重复的行。如果一行是重复的,但不跟随同一行,则不应删除。

例如,假设 testfile.txt 的内容是:

你好

你好

你好

你好。

如果调用为“alter testfile.txt”,则创建的字符数组应为:

你好。

你好。

这是我目前拥有的代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define MAX_NAME_SZ 100
#define caseChange 32
#define MAXCHARS 79
int main (int argc, char *argv[])
 
  char ch, *a;
  static char changed = 'f';

  /* if there is more than one argument */
  if (argc > 1)
    
      int i = 1, j = 0;
      FILE *fp;
      while (i < argc)
    
      a = malloc (MAX_NAME_SZ * sizeof (char));
      j = 0;
      fp = fopen (argv[i], "r");
      if (fp == NULL)
        
          /*Error statement in case an error is encountered /*
             fprintf (stderr, "Error encountered for File %s : %s\n",
             argv[i], strerror (errno));
             return 3;            /* I chose to return 3 if an error was encountered */
        
      else
        
          while (((ch = fgetc (fp)) != EOF) && (j < 99))
        
          a[j++] = ch;
        
          a[j] = '\0';

          fclose (fp);
          changeCase (a, changed);
          noNums (a, changed);
          identLines (a, changed);
          spaces (a, changed);
          printf ("\n");
        
      i++;

    
      if (changed == 'f')
    return 1;
      else
    return 0;

    
  else
    
      a = malloc (MAX_NAME_SZ * sizeof (char));
      fgets (a, MAX_NAME_SZ, stdin);
      changeCase (a, changed);
      noNums (a, changed);
      identLines (a, changed);
      spaces (a, changed);
      printf ("\n");
    

我假设我在做我的时候需要另一个 while 语句

while (((ch = fgetc (fp)) != EOF) && (j < 99))

但我不确定。任何帮助表示赞赏。

【问题讨论】:

fgets() 交替放入两个缓冲区,每次比较缓冲区内容。 一方面,将char ch 更改为int ch 以匹配fgetc 数据类型。另一方面,不要重新发明*** - 使用fgets 看起来很像***.com/q/50034090/2410359 我认为是相同的目标,是的。但我试图在第一次创建数组时从一开始就这样做,而不是稍后在子函数中通过编辑它。 【参考方案1】:

我没有阅读您的所有代码。 (嗯,风格问题“这是我的一大堆代码,有 100 行,请帮我找出错误”,而不是这个网站上的好问题。)

但我想指出这段代码:

char ch;
((ch = fgetc (fp)) != EOF)

...是典型的初学者错误。 “fgetc”返回“int”。在将它与 EOF 进行比较之前,您不得将此“int”转换为“char”。将“fgetc”结果放入“int”变量,然后将其与 EOF 进行比较,然后将“int”转换为“char”。在此之后对其进行任何其他处理。

也许会有所帮助。也许不吧。您的代码可能包含其他问题。让您的代码更小,我们可能会阅读它。

还有,这个:

while (((ch = fgetc (fp)) != EOF) && (j < 99))

...风格不好。我的意思是将很多东西放在“while”条件下的练习。这使得阅读变得困难。 while ((ch = fgetc (fp)) != EOF) 可以,假设 chint。此外,您的代码已损坏标识。如果您希望我们发表评论,您应该使您的代码尽可能易于阅读

【讨论】:

如果您认为这回答了问题,最好将其标记为***.com/questions/8586722/… 的重复如果它不打算回答,只是评论一个附带问题,那么请看这里:meta.stackexchange.com/questions/214173/… 否则请指出您的回答仅涵盖问题代码中的部分问题,这是可以接受的。对一些让你感到奇怪的事情做出回答,但没有阅读所有内容并没有那么受欢迎。

以上是关于如何仅使用命令行参数读取唯一行?的主要内容,如果未能解决你的问题,请参考以下文章

命令行参数,读取文件

如何在 C# 中读取另一个进程的命令行参数?

如何在 C++ 程序中使用命令行参数?

用awk如何读取shell命令行上的参数(参数可以是带空格的)

读取 LOLCODE 中的命令行参数

scrapy 怎样添加命令行参数