【发布时间】: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。 -
我认为是相同的目标,是的。但我试图在第一次创建数组时从一开始就这样做,而不是稍后在子函数中通过编辑它。