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会将找到的字符追加到输出字符串中吗?反正我想