如何使用 strstr() 函数?

How to use strstr() function?

我有两个文件 blacklist.txtemail.txtblacklist.txt 包含一些域名。 email.txt也包含了几个域名。我必须比较这两个文件并使用 strstr()blacklist.txt 的域名找到 email.txt功能。以下是我编写的代码。这段代码的问题是 returns 我输出 NULL 而不是匹配的 text/domain 名称。

#include <stdio.h>
#include <string.h>

#define MAXCHAR 1000

int main() {
    FILE *fp, *fp1;
    char str[MAXCHAR];
    char str2[MAXCHAR];
    char *result;

    fp = fopen("blacklist.txt", "r");
    fp1 = fopen("email.txt", "r");
    if (fp == NULL || fp1 == NULL) { 
        printf("\n Cannot open one of the files %s %s \n", fp, fp1); 
        //return = 0; 
        if (fp != NULL) fclose(fp); 
        if (fp1 != NULL) fclose(fp1); 
    } 
    
    while (fgets(str, MAXCHAR, fp) != NULL || fgets(str2, MAXCHAR, fp1) != NULL)
    //printf("%s, %s", str,str2);
    fclose(fp);
    fclose(fp1);
    result = strstr(str, str2);
    printf("The substring starting from the given string: %s", result);
    return 0;
}

以下是对您的代码的一些评论:

  • 打印错误消息具有未定义的行为,因为您传递的是 FILE* 指针而不是文件名。
  • 你的程序有未定义的行为,因为缺少 while 循环体。
  • 由于不能假定两个文件都已排序,因此应针对 email.txt 中的所有行测试 blacklist.txt 中的每一行.
  • 如果我们可以假设两行都以换行符结尾,则与 strstr() 的匹配意味着第二个文件中的行是第一个文件中行的后缀。如果 return 值是缓冲区的开头,则它是域匹配,如果前一个字符是 ..
  • ,则它是子域的匹配项

这是修改后的版本:

#include <stdio.h>
#include <string.h>

#define MAXCHAR 1000

int main() {
    FILE *fp, *fp2;
    char str[MAXCHAR];
    char str2[MAXCHAR];

    // open and check blacklist.txt
    fp = fopen("blacklist.txt", "r");
    if (fp == NULL) {
        printf("Cannot open %s\n", "blacklist.txt");
        return 1;
    }
    // open and check email.txt
    fp2 = fopen("email.txt", "r");
    if (fp2 == NULL) {
        printf("Cannot open %s\n", "email.txt");
        fclose(fp);
        return 1;
    }
    
    // for each line in blacklist.txt
    while (fgets(str, MAXCHAR, fp) != NULL) {
        // restart from the beginning of email.txt
        rewind(fp2);
        // for each line of email.txt
        while (fgets(str2, MAXCHAR, fp2) != NULL) {
            // check for a domain match
            char *p = strstr(str, str2);
            if (p != NULL && (p == str || p[-1] == '.')) {
                // compute the length of the domains (excluding the newline)
                int n = strcspn(str, "\n");
                int n2 = strcspn(str2, "\n");
                // output the message with the matching domains
                printf("domain match on %.*s for %.*s\n", n2, str2, n, str);
            }
        }
    }
    fclose(fp);
    fclose(fp2);
    return 0;
}