【发布时间】:2013-03-08 23:06:20
【问题描述】:
我正在用 c 训练自己,我的目标是读取文件并检查其中是否有给定的句子。如果给定的句子是否存在于文件中,该函数必须分别返回“找到”或“未找到”。
句子用/ 符号分隔。
Example of file:
1,2,3,4/
car, house, hotel/
2,age,12/
1,2/
1,2,3,5/
house, car/
Example of word to look for:
1,2/
我的想法是每次从文件中取出一个句子并将其放入一个数组(称为ary)中,检查数组(ary)是否等于包含给定句子的数组(称为句子) m 查找并重用该数组(ary)用于文件中的下一个句子。
我已经写了这段代码:
#include <stdio.h>
void main()
{
char *sentence;
FILE *my_file;
char *ary;
int size = 500;
int got;
int ind=0;
int rest;
int found=0;
sentence="1,2";
my_file=fopen("File.txt", "r");
if(my_file==NULL)
{
printf("I couldn't open the file\n");
}
else
{
ary = (char*)malloc(500*sizeof(char));
while((got=fgetc(my_file))!=EOF)
{
if(got!='/')
{
ary[ind++]=(char)got;
}
else
{
ary[ind++]='\0';
rest = compare(sentence,ary);
if(rest==0)
{
found =1;
printf("found\n");
return;
}
ind=0;
free(ary);
ary = (char*)calloc(500, sizeof(char));
}
}
if(found==0)
{
printf("not found\n");
}
fclose(my_file);
}
}
int compare(char str1[], char str2[])
{
int i = 0;
int risp;
if(str1>str2 || str1<str2)
{
risp=-1;
}
if(str1==str2)
{
while(str1[i++]!='\0')
{
if(str1[i]!=str2[i]) risp=1;
}
}
return risp;
}
它可以编译,但不能正常工作,我不知道为什么。 有人可以指出我的错误或让我知道更好的解决方案吗?
编辑: 当我打印与句子相关的两个 str 时,可以,但第一次打印后的另一个 str 继续打印,单词前面有一个中断。像下面这样:
Str1:1,2
Str2:1,2,3,4
Str1:1,2
Str2:
car, house, hotel
Str1:1,2
Str2:
2,age,12
Str1:1,2
Str2:
1,2
Str1:1,2
Str2:
1,2,3,5
Str1:1,2
Str2:
house, car
这可能是我的问题之一吗?我试图解决它...
【问题讨论】:
-
我建议您添加跟踪打印并学习如何使用调试器,例如GDB 及其 GUI 前端 DDD。尝试自己找出错误,学习如何调试自己和其他人的程序是作为程序员掌握的一项重要技能。
-
看看
strtok和strcmp。第一个可以让您更轻松地拆分句子,后者可以让您比较字符串。 -
虽然调试很重要,但我觉得 OP 在进入调试器之前需要真正理解一些基本概念(指针、数组等)(其中充满了有关地址位置和内存等的信息) )。
-
@CookieOfFortune:我想我可以同意这一点。但是调试器的基本用法仍然是最好早日学习的东西。它也可能是更好地理解指针的工具。
-
@AxelOmega 好的,如果我也想学习 gdb,你知道一些好的教程吗?