Как читать только уникальные строки, используя аргументы командной строки? - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время моя C-программа alter.c успешно создает массив символов a из текстовых файлов, вызываемых с помощью аргументов командной строки.

Однако я хочу изменить его так, чтобы вместо чтения в каждой строке он читал только в строках, которые не последовательных повторов предыдущей строки. Если строка повторяется, но не следует за ее идентичной строкой, ее не следует удалять.

Например, скажем, содержимое testfile.txt:

Привет

Привет, там

Привет

Hello.

Если вызывается как 'alter testfile.txt', создается массив символов:

Привет.

Hello.

Вот код, который у меня сейчас есть:

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

но я не уверен. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 апреля 2018

Я не прочитал весь ваш код. (Ну, вопросы в стиле «это большая часть моего кода с 100 строками, пожалуйста, помогите мне найти ошибки», а не хорошие вопросы на этом сайте.)

Но я хочу указать, что этот код:

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

... типичная ошибка новичка. "fgetc" возвращает "int". И вы НЕ должны конвертировать это "int" в "char", прежде чем сравнивать его с EOF. Поместите результат "fgetc" в переменную "int", затем сравните его с EOF и только после этого конвертируйте этот "int" в "char". И после этого выполните любую другую обработку с ним.

Может быть, поможет. Возможно, нет. Возможно, ваш код содержит другие проблемы. Сделайте ваш код меньше, и, вероятно, мы его прочтем.

Также это:

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

... это плохой стиль. Я имею в виду практику помещения многих вещей в состояние «время». Это затрудняет чтение. while ((ch = fgetc (fp)) != EOF) в порядке, при условии ch - int. Также в вашем коде нарушена идентификация. Вы должны сделать свой код как можно более удобным для чтения, если хотите, чтобы мы его комментировали

...