我试图创建一个从C中的流中删除重复字符串的函数。字符串已经排序,因此唯一必要的步骤是检查刚出现的字符串以确保当前字符串不是重复。但是,我尝试的实现并没有给我正确的输出。事实上,我根本没有输出。字符串由换行符分隔。谁能告诉我我在这里失踪了什么?
void dupEliminate(int file, char string[100])
{
FILE *stream;
stream = fdopen(file, "r");
char* savedString;
char* prevString;
while(!feof(stream)){
(fgets(savedString, 100, stream));
if(strcmp(savedString,prevString) != 0 ){
strcat(string, savedString);
strcpy(prevString,savedString);
}
答案 0 :(得分:1)
char* prevString;
prevString
在此函数中未初始化,但您在此处进行比较 -
if(strcmp(savedString,prevString) != 0 )
此外,在使用savedString
, 在fgets
中进行输入之前,您需要使用 malloc
或{为其分配内存{1}},因为它是一个非真实的指针。
它会比较什么?初始化您calloc
然后进行比较。
注意 - 只是建议而不是使用prevString
,请使用while(!feof(stream))
来控制循环 -
fgets
答案 1 :(得分:0)
你需要给savedString和prevString一些内存 - malloc或者让它们成为char [101]
您还需要初始化prevString
prevString需要无条件地使用最后一行更新,而不是IsAlive
块
我不喜欢这些名字:)
答案 2 :(得分:0)
根据您发布的代码,目前还不清楚您最终想要对非重复字符串做什么。目前,即使您只收集非重复的字符串,您当前也会覆盖string
中的值,而不会对其进行任何操作。
如果您正在读取连续流,那么您需要在某处打印(或保存或复制)非重复string
以使用它,或者您需要缓冲不重复的在某个地方使用字符串并在缓冲区已满时使用它们。
由于您说您没有获得正确的输出,但没有列出输出功能,因此您有点猜测您要做什么。如果您只是想输出非重复的字符串,那么您只需打印它们(注意使用fgets
,您将在每个字符串读取的末尾有一个newline
。一个例子是:
#define MAXC 100
...
char string[MAXC] = {0};
...
void dupEliminate (int file, char *string)
{
FILE *stream;
stream = fdopen (file, "r");
if (!stream) {
fprintf (stderr, "dupEliminate() error: stream open failed.\n");
return;
}
char pre[MAXC] = {0}; /* previous string */
size_t word = 0;
while (fgets (string, MAXC, stream)) {
if (word == 1) {
if (strcmp (pre, string) != 0) {
printf ("%s", pre);
printf ("%s", string);
}
else
printf ("%s", string);
}
if (word > 1 && strcmp (pre, string) != 0)
printf ("%s", string);
strncpy (pre, string, MAXC);
word++;
}
fclose (stream);
}
如果您的目的是缓冲所有非重复字符串并使其在main()
中可用,那么您需要做几件事。如果您有任何进一步的问题,请告诉我,如果我有更多有关您意图的详细信息,我很乐意与您进一步合作。