我正在开发一个函数,通过.txt文件逐行读取以搜索提供的单词。我可以使用的唯一字符串比较函数是strcasecmp,因为这是一个学习练习。这是迄今为止的功能......
int wordsFindFast(const char const* w){
int first = 0; //beginning of array
int last = MAX_NB_WORDS - 1; // number of last element in array
int middle; // middle of array
int len = strlen(w);
while(first <= last) {
middle = (first + last) / 2;
if (strncasecmp(w, words[middle], len) == 0) return 1;
else if(strncasecmp(w, words[middle], len) < 0) {
last = middle - 1;
}
else first = middle + 1;
}
return 0;
}
现在发生的事情是搜索工作正常,除非单词列表后面有一个单词,这个单词长度接近70,000个条目。我更新了代码以使用strncasecmp而不是strcasecmp。
以下是在代码的开头定义的,MAX_NB_WORDS和MAX_WORD_LENGTH是全局变量。
static const char* dataFileName = "words.txt";
答案 0 :(得分:0)
查看“搜索”的内容。例如,如果您正在读取内容为“x”的行,则“fgets()”将返回“x \ n”。这不是你想要的......
建议更改:
int wordsFindSlow(const char const* w){
...
char search[MAX_WORD_LENGTH+1];
int len = strlen(w);
while(fgets(search, MAX_WORD_LENGTH, dataFile)) {
if (strncasecmp(w, search, len) == 0) {
return 1;
}
答案 1 :(得分:0)
编写代码的方式,w
和search
都必须以相同的字符开头。最好使用w
在search
中查找strchr
的第一个字符,然后使用strncasecmp
,第三个参数等于strlen(w)
。如果它没有给你匹配,请查找以w
的第一个字符开头的下一个字符并重复直到找到一个字符,该字符留下search
的较小部分与strlen(w)
进行比较1}}。以下是使用foobar
和fubar
测试的代码。
int wordsFindSlow(const char const* w){
/*
ROLE Determines whether a given word is in our words array
Implements slow linear algorithm
PARAMETERS w word to look for in the words array
RETURN VALUE 1 true if the word was found
0 false if the word was not found
*/
char search[] = "This is for testing foobar";
char * substr = strchr ( search, w[0] );
while ( substr && strlen ( substr ) >= strlen ( w ) )
{
if ( ! strncasecmp ( w, substr, strlen ( w ) ) )
return ( 1 );
substr = strchr ( substr + 1, w[0] );
}
return 0;
}