加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:51:40 所属栏目:百科 来源:网络整理
导读:我正在做这个任务,我被困住了.目标是读取文件并查找文件中String中是否存在这些char值.我必须将文件中的String与作为参数放入的另一个String进行比较.但是,只要每个char值都在文件的String中,那么它就“匹配”. 示例(输入和输出): ./a.out file1 done done
我正在做这个任务,我被困住了.目标是读取文件并查找文件中String中是否存在这些char值.我必须将文件中的String与作为参数放入的另一个String进行比较.但是,只要每个char值都在文件的String中,那么它就“匹配”.

示例(输入和输出):

./a.out file1 done
done is in bonehead
done is not in doggie

示例(file1):

bonehead
doggie

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

#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 emptyn");
            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);
}

解决方法

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

#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 stringn",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,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",line);
        else
            printf ("%s is in %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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读