簡體   English   中英

如何僅使用命令行參數讀取唯一行?

[英]How do I only read in unique lines using command-line arguments?

當前,我的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進行比較之前,請勿將“ int”轉換為“ char”。 將“ fgetc”結果放入“ int”變量,然后將其與EOF進行比較,然后再將“ int”轉換為“ char”。 之后,再進行其他處理。

也許會有所幫助。 也許不吧。 您的代碼可能包含其他問題。 使您的代碼更小,可能我們會閱讀。

另外,這:

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

...風格不好。 我的意思是把很多東西放在“同時”狀態下的做法。 這使其難以閱讀。 假設chintwhile ((ch = fgetc (fp)) != EOF)可以。 另外,您的代碼有損壞的標識。 如果要我們注釋它,則應使代碼盡可能易於閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM