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

但是,我想对其进行更改,以便只读取不是上一行的连续重复的行,而不是读取每一行。如果某行是重复行,但未遵循同一行,则不应删除该行。

例如,说testfile.txt的内容是:


  嗨,您好
  
  嗨,您好
  
  嗨,您好
  
  你好。


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


  嗨,您好。
  
  你好。


这是我目前拥有的代码:

#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))


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

最佳答案

我没看完你所有的代码。 (好吧,风格上的问题“这是我的代码中有100行,请帮我找出错误”,这不是该网站上的好问题。)

但我想指出这段代码:

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


...是典型的初学者错误。 “ fgetc”返回“ int”。而且,在将其与EOF进行比较之前,请勿将其转换为“ char”。将“ fgetc”结果放入“ int”变量,然后将其与EOF进行比较,然后再将“ int”转换为“ char”。之后,再进行其他处理。

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

另外,这:

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


...风格不好。我的意思是把很多东西放在“同时”状态下的做法。这使其难以阅读。假设while ((ch = fgetc (fp)) != EOF)chint是可以的。另外,您的代码具有损坏的标识。如果要我们注释它,则应使代码尽可能易于阅读

关于c - 如何仅使用命令行参数读取唯一行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50051936/

10-11 22:06
查看更多