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

Posted

技术标签:

【中文标题】检查字符串中是不是存在所有 char 值【英文标题】:Check if all char values are present in string检查字符串中是否存在所有 char 值 【发布时间】:2016-08-03 00:42:18 【问题描述】:

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

示例(输入和输出):

./a.out file1 完成 完成是在白痴中 done 不在小狗中

示例(文件 1):

白痴 小狗

如您所见,比较字符串的顺序无关紧要,文件也遵循每行一个单词。我已经编写了一个程序来查找另一个字符串中是否存在 char 值,但这只是问题的一部分。知道该怎么做吗?

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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 <file> <word>\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);

【问题讨论】:

看起来我得到了一些意见但没有回应,我的问题措辞很糟糕吗?如果需要,我可以改写或解释。 任务是检查字符,而不是字符串。因此,根据您所写的要求,字符顺序无关紧要(老师可能会给出不同的指示)。 只是令人困惑。在这里,您正在测试您的文件中的字符是否在您的输入中。 只有一个变量all_found 设置为真值;如果strchr 返回NULL,则将all_found 设置为false 值并中断。 啊,你应该 char *c = word;strchr(line, *c);您正在检查命令行中单词中的所有字符是否存在于给定行中。 【参考方案1】:

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

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

if (strchr(word ... 行正在测试测试单词是否包含文件中单词中的一个字母。 这似乎与您尝试做的相反 - 查找是否可以在文件中的单词中找到测试单词中的所有字母。

printf 行是不明智的,因为没有非此即彼的 - 你需要一行打印“是”我们的字母存在,而一行打印“否”至少一个字母不存在。

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

这段代码 sn-p 可能会有所帮助

    /* 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++;
    

【讨论】:

【参考方案2】:

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

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

#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

您可以决定是否以不同的方式处理重复字符,但您应该确定如何处理这种意外情况。

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

【讨论】:

以上是关于检查字符串中是不是存在所有 char 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在Javascript中检查字符串结束位置是不是存在值? [复制]

用PHP检查逗号分隔的字符串中是不是存在值[重复]

使用 C# 检查 List 中是不是存在值

检查值是不是存在的数组列表,如果存在则将 1 添加到字符串

如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换

检查文件中是不是存在所有多个字符串或正则表达式