我正在用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)是否等于包含给定句子的数组(称为句子)我正在寻找,并将该数组(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是好的,但是第一个打印后的另一个继续打印,在单词前面有一个休息。如下所示:
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
这可能是我的一个问题吗?我试着解决它......
答案 0 :(得分:2)
str1和str2实际上是指针(它们指的是存储字符串的第一个元素的内存位置)。因此,使用&gt;将str1与str2进行比较和==只会比较他们的记忆位置。如果它们位于不同的位置(它们将会),则str1和str2永远不会相等。
您要做的是逐步执行str1和str2并比较值。我把它作为海报的练习。
答案 1 :(得分:1)
在C中移动字符串绝对是可行的,但它很有用,因为你真的必须理解指针和分配在幕后是如何工作的。那么我可以建议另一种不涉及移动弦的方法吗?
首先 - 让我们在psuedocode中写下如何在文件中查找字符串的定义:
def file_contains_string(file, string):
if (file is empty):
return "not found"
else if (initial_part_of_file_equals(file, string)):
return "found it!!!"
else
return file_contains_string(drop_first_character(file), string)
即。 “如果文件的第一部分等于字符串,则文件包含字符串,或者文件的某些后面部分等于字符串。”
以下是C:
的翻译int file_contains_string(FILE *file, char *str)
{
if (feof(file)) return 0;
if (initial_part_of_file_equals(file, str)) return 1;
fgetc(file); /* discard leading character from the file */
return file_contains_string(file, str);
}
现在我们如何实施initial_part_of_file_equals
?好吧,如果第一个字符相等,文件的初始部分匹配,然后字符串的其余部分匹配文件的初始部分超过第一个字符:
def initial_part_of_file_equals(file, string):
if is_empty(string):
return True
else if first_character(string) == first_character(file):
return initial_part_of_file_equals(drop_first_character(file),
drop_first_character(string))
else return False
我们如何翻译?在C中,“字符串”只是指向字符数组的指针,因此只需通过前进指针即可“删除字符串的第一个字符”。并且只需通过取消引用指针来比较字符串的第一个字符。
int initial_part_of_file_equals(FILE * file, char * str)
{
if !(str*) return 1; /* Test for empty string */
if (feof(file)) return 0; /* Test for empty file */
char c = fgetc(file); /* get first character from file */
int result = (c == *str)
&& initial_part_of_file_equals(file, str++);
ungetc(c, file);
return result;
}
ungetc
中的str
很重要 - 如果只有{{1}}的第一个部分匹配,我们要确保我们实际上不会消耗相应的部分输入流。
答案 2 :(得分:1)
char c;
char str[]="1,2/";
FILE * f;
int i=0;
f=fopen("File.txt", "r");
if (f==NULL) perror ("Error opening file");
else
{
while ((c=(char)fgetc(f)) != EOF) {
if((c==str[i])) {
if (c=='/')
{
printf("FOUND\n");
return;
}
i++;
}
else i=0;
if(c=='/')
i=0;
}
printf("NOT FOUND\n");
fclose (f);
}