如何使用 strstr() 函数?
How to use strstr() function?
我有两个文件 blacklist.txt 和 email.txt。 blacklist.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;
}
我有两个文件 blacklist.txt 和 email.txt。 blacklist.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;
}