代码之家  ›  专栏  ›  技术社区  ›  Vojta Martinec

在从文件[duplicate]提取的字符串中查找输入子字符串

  •  1
  • Vojta Martinec  · 技术社区  · 10 年前

    基本上,我想知道为什么这个代码不起作用。似乎 strstr() 总是 NULL ,就像所有这些代码一样 "word not found" .

    我已经试过了 if (strstr(retezec,substring)!=NULL) ,但它也不起作用。

    int main()
    {
    
        FILE *files;
        files = fopen("Knihovna.txt","rb+");
    
        int i = 0;
        while(fgetc(files)!=EOF){
            i++;
        }
        //printf("%d",i);
    
        rewind(files);
        char *retezec;
        retezec = (char *)malloc(i);
        fread(retezec, i, 1, files);
    
        puts("zadejte hledane slovo");
    
        char *substring;
        substring = (char *)malloc(50);
        fflush(stdin);
        fgets(substring,49, stdin);
    
        char *found;
        found = strstr(retezec,substring);
    
        if(found){
            printf("word found!");
        }
        else{
            puts("word not found");
        }
    
    }
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   P.P    10 年前

    这很可能是 fgets() 读取尾随的换行符。

    fgets(substring,49, stdin);
    

    如果 substring 有空间。所以如果你输入 "name" 。你实际上有 "name\n" .

    使用以下命令删除尾随换行符:

    char *p = strchr(substring, '\n');
    if (p) *p = 0; // remove the newline, if present
    

    你还有一个问题。 fread() 不以NUL终止。它只读取请求的字节。所以你需要检查 弗雷德() 阅读 i 字节或更少,并使用该数字(返回值 弗雷德() )以查找实际读取的字节。因为它可能低于要求。然后,分配一个额外的字节,如果您想将其用作C字符串,则NUL终止它。