我一直在阅读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语句吗?
提前致谢!
答案 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循环只读取行直到文件末尾而不处理它们。