我将如何使用strtok逐字比较

时间:2011-07-01 07:22:26

标签: c

我一直在阅读strtok,并认为这将是我逐字逐句比较两个文件的最佳方式。到目前为止,我无法弄清楚我将如何做到这一点

这是我的功能:

int wordcmp(FILE *fp1, FILE *fp2)
{
   char *s1;
   char *s2;
   char *tok;
   char *tok2;
   char line[BUFSIZE];
   char line2[BUFSIZE];
   char comp1[BUFSIZE];
   char comp2[BUFSIZE];
   char temp[BUFSIZE];
   int word = 1;
   size_t i = 0;

while((s1 = fgets(line,BUFSIZE, fp1)) && (s2 = fgets(line2,BUFSIZE, fp2)))
{
    ;
}

tok = strtok(line, " ");
tok2 = strtok(line, " ");

while(tok != NULL)
{
    tok = strtok (NULL, " ");

}


return 0;
}

不介意未使用的变量,我已经在这3个小时,并尝试了所有可能的方法,我可以想到比较第一和第二strtok的值。另外我想知道如何检查哪个文件首先达到EOF。

当我尝试

  if(s1 == EOF && s2 != EOF)
  {
      return -1;
  }

即使文件相同,它也会返回-1!是因为为了使它在循环之外到达if语句,两个文件都达到了EOF,这使得程序总是转到这个if语句吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果要检查文件是否相同,请尝试执行,

    do {
       s1 = fgetc(fp1);
       s2 = fgetc(fp2);

       if (s1 == s2) {
            if (s1 == EOF) {
                return 1; // RETURN TRUE
            }
            continue;
      }
      else {
        return -1;  // RETURN FALSE
      }

  } while (1);

祝你好运:)

答案 1 :(得分:1)

使用strtok()时,通常使用如下代码:

tok = strtok(line, " ");
while (NULL != tok)
{
    tok = strtok(NULL, " ");
}

循环中调用中的NULL告诉strtok在先前找到的标记之后继续,直到它在您最初传递的值(行)中找到空终止字符,或者直到没有其他标记为止。当前指针存储在运行时库中,一旦strtok()返回NULL以指示不再有令牌,使用NULL作为第一个参数(继续)将再次调用strtok()将导致NULL。你需要用另一个值(例如另一个调用strtok(line,“”))来调用它以使它重新开始。

这意味着在两个不同的字符串上使用strtok同时需要手动更新字符串位置并在每次调用时传递修改后的值。

tok = strtok(line, " ");
tok2 = strtok(line2, " ");
while (NULL != tok && NULL != tok2)
{
    /* Do stuff with tok and tok2 here */
    if (strcmp(tok, tok2)... {}
    /* Update strtok pointers */
    tok += strlen(tok) + 1;
    tok2 += strlen(tok2) + 1;
    /* Get next token */
    tok = strtok(tok, " ");
    tok2 = strtok(tok2, " ");
}

你仍然需要添加逻辑来确定行是否不同 - 如果在不同的位置发生换行但是周围的单词是相同的,你还没有说明文件是否相同。我假设它应该是,给定你的描述,但它使逻辑更尴尬,因为你只需要为文件执行初始fgets()和strtok(),如果你还没有令牌。您还需要查看如何读入文件。目前,您的第一个while循环只读取行直到文件末尾而不处理它们。