在C中搜索.txt文件中的字符串?

时间:2014-03-24 00:35:04

标签: c search fgets

我正在开发一个函数,通过.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"; 

2 个答案:

答案 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)

编写代码的方式,wsearch都必须以相同的字符开头。最好使用wsearch中查找strchr的第一个字符,然后使用strncasecmp,第三个参数等于strlen(w)。如果它没有给你匹配,请查找以w的第一个字符开头的下一个字符并重复直到找到一个字符,该字符留下search的较小部分与strlen(w)进行比较1}}。以下是使用foobarfubar测试的代码。

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;
}