2015-11-13 40 views
0

我想创建一个函数,从C中的流中删除重复的字符串。字符串已经排序,所以唯一必要的步骤是检查刚才出现的字符串,以确保当前的字符串不是重复的。但是,我的尝试实现并没有给我正确的输出。事实上,我根本没有输出。这些字符串由换行符分隔。谁能告诉我我在这里失踪了什么?在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

'string'应该在这个函数中扮演什么角色? –

+0

您似乎每次都会覆盖'string'到最后? –

回答

1
char* prevString; 

prevString未初始化这个功能,但你在这里进行比较 -

if(strcmp(savedString,prevString) != 0) 

此外,使用fgets以输入savedString之前,你需要分配内存以它使用malloccalloc,因为它是一个未初始化的指针。

它会比较什么?初始化你prevString,然后比较它。

注意 - 只是一个建议,而不是使用while(!feof(stream)),使用fgets控制环路 -

while(fgets(savedString, 100, stream)!=NULL){ 
... 
} 
+0

这正是我所需要的,我总是忘记malloc在C中,并且终止条件完美工作。谢谢。 – raze18

+0

@ raze18欢迎您,也请记住免费分配内存:-) – ameyCU

0

你需要给savedString和prevString一些内存 - malloc的或使它们的char [101]

您还需要初始化prevString

prevString需要无条件地更新最后一行,而不是在if阻止

我不喜欢这个名字要么:)

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()可用,那么有你需要做的几件事情。如果您有任何进一步的问题,请告诉我,我很乐意与您进一步合作,只要我有更多关于您的意图的细节。