查找从File中提取的字符串中的输入子字符串

时间:2016-01-03 10:44:35

标签: c string strstr

基本上,我想知道为什么这段代码不起作用。似乎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 个答案:

答案 0 :(得分:3)

最有可能是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没有终止。它只是读取请求的字节。因此,您需要检查fread()是否读取i个字节或更少,并使用该数字(返回值fread())来查找读取的实际字节数。因为它可能少于要求。然后,分配一个额外的字节,如果你想把它用作C字符串,NUL就会终止它。