检查字符串中是否存在所有char值

我正在做这个任务,我被困住了。 目标是读取文件并查找文件中String中是否存在这些char值。 我必须将文件中的String与作为参数放入的另一个String进行比较。 但是,只要每个char值都在文件的String中,那么它就“匹配”。

示例(输入和输出):

./a.out file1完成
完成是在笨蛋
完成不是在小狗

示例(file1):


正如您所看到的那样,比较字符串无关紧要,文件每行也跟着一个单词。 我把一个程序放在一起,查找char值是否存在于另一个String中,但这只是问题的一部分。 知道如何去做吗?

#define _GNU_SOURCE #include  #include  #include  int main(int argc, char **argv){ FILE *f = fopen(argv[1], "r"); char *line = NULL; size_t len = 0; ssize_t read; char *word = argv[2]; if(argc != 3){ printf("./a.out  \n"); exit(EXIT_SUCCESS); } if(f == NULL){ printf("file empty\n"); exit(EXIT_SUCCESS); } // confused what this loop does too while((read = getline(&line, &len, f)) != -1){ char *c = line; while(*c){ if(strchr(word, *c)) printf("can't spell \"%s\" without \"%s\"!\n", line, word); else printf("no \"%s\" in \"%s\".\n", word, line); c++; } } fclose(f); exit(EXIT_SUCCESS); } 

另一种方法是简单地保持从文件读取的行中匹配的每个字符的sum ,为提供给测试的单词中的每个唯一字符添加一个,如果总和等于由唯一字符组成的字符串的长度是搜索项,然后搜索项中的每个唯一字符都包含在从文件中读取的行中。

 #include  #include  #define MAXC 256 int main (int argc, char **argv) { if (argc < 3 ) { /* validate required arguments */ fprintf (stderr, "error: insufficient input, usage: %s file string\n", argv[0]); return 1; } FILE *fp = fopen (argv[1], "r"); char line[MAXC] = ""; char *s = argv[2]; /* string holding search string */ size_t slen = strlen(s), sum = 0, ulen; char uniq[slen+1]; /* unique characters in s */ if (!fp) { /* validate file open */ fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); return 1; } memset (uniq, 0, slen+1); /* zero the VLA */ /* fill uniq with unique characters from s */ for (; *s; s++) if (!strchr (uniq, *s)) uniq[sum++] = *s; ulen = strlen (uniq); s = argv[2]; /* reset s */ while (fgets (line, MAXC, fp)) { /* for each line in file */ if (strlen (line) - 1 < ulen) { /* short line, continue */ printf ("%s is not in %s", s, line); continue; } char *up = uniq; /* ptr to uniq */ sum = 0; /* reset sum */ while (*up) if (strchr (line, *up++)) sum++; /* count chars */ if (sum < ulen) /* validate sum */ printf ("%s is not in %s", s, line); else printf ("%s is in %s", s, line); } fclose (fp); /* close file */ return 0; } 

示例使用/输出

 $ ./bin/strallcinc dat/words.txt done done is in bonehead done is not in doggie 

这对于搜索字符串中的重复字符同样有效。 例如

 $ ./bin/strallcinc dat/words.txt doneddd doneddd is in bonehead doneddd is not in doggie 

您可以决定是否以不同方式处理重复字符,但是您应该确定如何解决该意外事件。

如果您有任何疑问,请告诉我。

confused what this loop does
while (read ...行显然是从文件中读取行,将它们放在行变量中

* c是指向变量line开头的指针,该指针以c++递增,以便访问文件中单词中的每个字母。 当* c指向空终止符(0)时,while循环将终止。

if (strchr(word ...行测试,如果测试单词包含文件中单词的一个字母。这似乎与你想要做的相反 – 查找测试中的所有字母)单词可以在文件中的单词中找到。

printf行是不明智的,因为没有任何一个/或 – 你需要一行打印’是’我们的字母存在和一行打印’否’至少一个字母不存在。

printf语句应该在比较循环之外,这样你就不会为每个单词获得多行输出。 添加一个标志,以显示单词中是否存在任何字母。 在开始时将标志设置为1,并且仅在字母不存在时将其更改为0,然后使用该标志打印两个结果语句中的一个。

此代码段可能会有所帮助

  /* set flag to 'letters all present' */ int flag = 1; /* set pointer c to start of input line */ c = word; /* test word from file for each letter in test word */ while(*c) { if(strchr(line, *c) == NULL) { /* set flag to letter not present */ flag = 0; break; } c++; }