C 搜索文件时发生访问冲突

C 搜索文件时发生访问冲突,c,search,strstr,C,Search,Strstr,这是我在文件中搜索术语的算法 void ricerca_file(char* frase){ char* prelievo = ""; file = fopen("*userpath*\\file.bin", "rb"); while((fgets(prelievo, sizeof(prelievo), file)) != NULL){ if((strstr(prelievo, frase)) != NULL) printf("frase trovata!\n"); }

这是我在文件中搜索术语的算法

void ricerca_file(char* frase){

char* prelievo = "";
file = fopen("*userpath*\\file.bin", "rb");
while((fgets(prelievo, sizeof(prelievo), file)) != NULL){
    if((strstr(prelievo, frase)) != NULL)
        printf("frase trovata!\n");
} 

fclose(file);
printf("%s", prelievo);}
我通过以下方式请求输入
frase

char* frase = "";
printf("insert the term that you want to search..");
scanf("%s", frase);
然后我用以下命令调用函数:

ricerca_file(frase);
在我写入输入(例如数字2)后,编译器给了我这个错误:

prove1.exe:0xC0000005:访问冲突写入位置0x00F67BC3

如果存在此异常的处理程序,则程序可能会安全运行 继续

我做错了什么

如果不清楚,我正在学习。但我真的不知道如何管理搜索一个词到一个文件。
我猜,使用这种算法,我可能会错过很多匹配,因为如果我搜索“hello”,使用strstrstr函数,每个周期移动5个字符,如果我有一个文本像“abchelloabc”这样的文件,他将首先找到“abche”,而不会找到任何内容,而在第一个周期后,它将转到“lloab”部分,然后是“c”。我是否认为它是这样工作的,这是错误的?

您需要实际提供内存来保存扫描到的字符串。请尝试以下方法:

char frase[80];
printf("insert the term that you want to search..");
fgets(frase, 80, stdin);
这将为80个字符分配足够的空间,然后读取一行输入


还请检查所有这些函数的结果:如果它们返回错误,您应该采取适当的行动。

您需要实际提供内存来保存扫描到的字符串。请尝试以下方法:

char frase[80];
printf("insert the term that you want to search..");
fgets(frase, 80, stdin);
这将为80个字符分配足够的空间,然后读取一行输入


还请检查所有这些函数的结果:如果它们返回错误,您应该采取适当的措施。

prelievo
指向字符串文字。这是无法写入的常量数据。而
sizeof(prelievo)
将是2或4(或系统上的任何大小指针),这不是您想要的

您需要将
prelievo
指向可以修改的字符数组:

char prelievo[1000];
同样的问题和解决方案也适用于frase:

char frase[1000];

prelievo
指向字符串文本。这是无法写入的常量数据。而
sizeof(prelievo)
将是2或4(或系统上的任何大小指针),这不是您想要的

您需要将
prelievo
指向可以修改的字符数组:

char prelievo[1000];
同样的问题和解决方案也适用于frase:

char frase[1000];
我做错了什么:

关于:

char* prelievo = "";
file = fopen("*userpath*\\file.bin", "rb");
while((fgets(prelievo, sizeof(prelievo), file)) != NULL){
    ...
对fgets()的调用需要有一个指向缓冲区的指针作为其“第一个参数”

“prelievo”只是一个非斜体指针

建议1)

建议2)

我做错了什么:

关于:

char* prelievo = "";
file = fopen("*userpath*\\file.bin", "rb");
while((fgets(prelievo, sizeof(prelievo), file)) != NULL){
    ...
对fgets()的调用需要有一个指向缓冲区的指针作为其“第一个参数”

“prelievo”只是一个非斜体指针

建议1)

建议2)


这个答案与你的问题并不完全相关,但因为你已经得到了答案,如果你忽略了一些问题,我会尝试向你解释

如果我们没有检查错误/返回,并且程序运行良好,这并不意味着程序正常或安全。 让我们以下面的场景为例

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

char *printFile(char *fileName){
    size_t length,size;
    char *buffer;
    FILE *file;

    file = fopen (fileName , "r" );


    fseek (file , 0 , SEEK_END);
    length = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc(length);
    if (buffer == NULL){
        fputs ("Memory error",stderr);
        exit (2);
    }


    size = fread (buffer,1,length,file);
    if (size != length){
        fputs ("Reading error",stderr);
        exit(3);
    }

    fclose (file);
    return buffer;
}

int main (void) {
    char *fileName = "test.txt";
    char *stringToSearch = "Addams";
    char *fileContent = printFile(fileName);

    if (strstr(fileContent, stringToSearch)){
        printf("%s was Found\n",stringToSearch);
    }else{
        printf("%s was not Found\n",stringToSearch);
    }

    free(fileContent);

    return 0;
}
现在如果我运行这个程序,我会得到:

亚当斯被发现了

一切似乎都很好,但如果我尝试与他人共享此程序,会发生什么情况?或者如果我尝试在另一台计算机上运行它会发生什么? 嗯:

分段故障(堆芯转储)

天哪,刚才发生了什么事?很简单,文件test.txt丢失,我没有在程序中检查这一点,这就是原因

让我们继续并创建该文件,然后再次运行该程序:

亚当斯没有找到

哈,我成功了,不是吗?当然不是,瓦尔格兰德有另一个观点:


发生的情况是,我试图阅读一个新创建的文件,但没有考虑该文件是否有某些内容,我对其进行了大量编码。

此答案与您的问题并不完全相关,但因为您已经得到了答案,如果您忽略了这些问题,我将尝试向您解释一些问题

如果我们没有检查错误/返回,并且程序运行良好,这并不意味着程序正常或安全。 让我们以下面的场景为例

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

char *printFile(char *fileName){
    size_t length,size;
    char *buffer;
    FILE *file;

    file = fopen (fileName , "r" );


    fseek (file , 0 , SEEK_END);
    length = (size_t)ftell (file);
    fseek (file , 0 , SEEK_SET);

    buffer = malloc(length);
    if (buffer == NULL){
        fputs ("Memory error",stderr);
        exit (2);
    }


    size = fread (buffer,1,length,file);
    if (size != length){
        fputs ("Reading error",stderr);
        exit(3);
    }

    fclose (file);
    return buffer;
}

int main (void) {
    char *fileName = "test.txt";
    char *stringToSearch = "Addams";
    char *fileContent = printFile(fileName);

    if (strstr(fileContent, stringToSearch)){
        printf("%s was Found\n",stringToSearch);
    }else{
        printf("%s was not Found\n",stringToSearch);
    }

    free(fileContent);

    return 0;
}
现在如果我运行这个程序,我会得到:

亚当斯被发现了

一切似乎都很好,但如果我尝试与他人共享此程序,会发生什么情况?或者如果我尝试在另一台计算机上运行它会发生什么? 嗯:

分段故障(堆芯转储)

天哪,刚才发生了什么事?很简单,文件test.txt丢失,我没有在程序中检查这一点,这就是原因

让我们继续并创建该文件,然后再次运行该程序:

亚当斯没有找到

哈,我成功了,不是吗?当然不是,瓦尔格兰德有另一个观点:


发生的事情是,我试图读取一个新创建的文件,而没有考虑该文件是否有某些内容,我对其进行了大量编码。

谢谢!成功了。但我有一些问题。输出显示了我搜索的术语的3个实例(当时只有2个);这个代码应该打印所有的事件吗?我不这么认为。。或者strstr会将找到的字符追加到输出字符串中吗?不管怎样,我认为我的最后一个疑问是正确的。strstr()是否会移动函数第二个int参数的大小?它不应该漏掉某些单词吗?如果找到匹配项,strstrstr()是否会首先自己打印字符串?如果我要搜索整个文件,我应该在strstr上添加什么维度?sizeof(文件)?同样,
strstr()
不接受任何尺寸。谢谢!成功了。但我有一些问题。输出显示了我搜索的术语的3个实例(当时只有2个);这个代码应该打印所有的事件吗?我不这么认为。。或者strstr会将找到的字符追加到输出字符串中吗?反正我想