[英]Searching .txt file for string in C?
我正在使用一個函數來通過.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";
查看“搜索”的內容。 例如,如果您正在讀取內容為“ 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;
}
w
和search
必須以相同的字符開頭,從而編寫代碼。 您最好使用strchr
在search
中search
w
的第一個字符,然后使用strncasecmp
並將第三個參數等於strlen(w)
。 如果沒有找到匹配項,請從w
的第一個字符開始尋找下一個字符,然后重復進行直到與strlen(w)
相比, strlen(w)
一個要測試的search
部分較小的字符。 這是使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.