搜索文件时访问冲突

时间:2015-08-24 14:14:54

标签: 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");
} 

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”,使用strstr函数每个周期移动5个字符如果我有一个文本像这样的“abchelloabc”他将首先找到“abche” “并且找不到任何东西,而在第一个循环之后,它将进入”lloab“部分,然后进入”c“。我认为它是这样的,这是错的吗?

3 个答案:

答案 0 :(得分:4)

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

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

char prelievo[1000];

同样的问题和解决方案适用于frase

char frase[1000];

答案 1 :(得分:0)

您需要实际提供内存以保存扫描的字符串。尝试这样的事情:

char frase[80];
printf("insert the term that you want to search..");
fgets(frase, 80, stdin);

这为80个字符分配足够的空间,然后读取一行输入。

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

答案 2 :(得分:0)

我做错了什么:

关于:

char* prelievo = "";
file = fopen("*userpath*\\file.bin", "rb");
while((fgets(prelievo, sizeof(prelievo), file)) != NULL){
    ...

对fgets()的调用需要有一个指向缓冲区的指针作为其第一个参数。

'prelievo'只是一个未经宣传的指针。

建议1)

char* prelievo = malloc( 1024 );
if ( prelievo ) {
    file = fopen("*userpath*\\file.bin", "rb");
    while((fgets(prelievo, sizeof(prelievo), file)) != NULL){

建议2)

char prelievo[1024];
file = fopen("*userpath*\\file.bin", "rb");
while((fgets(prelievo, sizeof(prelievo), file)) != NULL){