目前,我的C程序inter.c从使用命令行参数调用的文本文件中成功地创建了char数组a。
但是,我想要修改它,这样它将只在不连续重复前一行的行中读取,而不是在每一行中读取。如果一行是重复的,但不遵循其相同的行,则不应删除它。
例如,假设testfile.txt的内容是:
嗨,你好 嗨,你好 嗨,你好 你好。
如果调用为‘ALTERtestfile.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 (((ch = fgetc (fp)) != EOF) && (j < 99))
但我不确定。任何帮助都是非常感谢的。
发布于 2018-04-26 15:11:59
我没看过你所有的代码。(嗯,在这个网站上,“这是一大串我的100行代码,请帮我找错误”而不是好问题。)
但我想指出的是这个代码:
char ch;
((ch = fgetc (fp)) != EOF)
...is典型的初学者错误。"fgetc“返回"int”。在与EOF进行比较之前,您不能将此"int“转换为"char”。将"fgetc“结果放入"int”变量,然后将其与EOF进行比较,然后将此"int“转换为"char”。然后用它做任何其他的处理。
也许会有帮助。也许不是。您的代码可能包含其他问题。使您的代码更小,我们可能会阅读它。
此外,这也是:
while (((ch = fgetc (fp)) != EOF) && (j < 99))
...is不好的风格。我指的是把很多东西放进“时间”状态的练习。这使得它很难读懂。while ((ch = fgetc (fp)) != EOF)
是可以的,假设ch
是int
。而且,您的代码已经失效了。如果你想让我们评论你的代码,你应该让它尽可能容易阅读。
https://stackoverflow.com/questions/50051936
复制