这是我将术语搜索到文件中的算法。
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“。我认为它是这样的,这是错的吗?
答案 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){