我這段代碼是一個更大的代碼的一部分,但這個片段基本上做的是searchword();函數使用strstr查找與用戶輸入相匹配的所有單詞輸入搜索詞將單詞的初始位置放入keywordsat []整型數組中,以便我可以將它用於文本的print 1行。什麼searchword();返回僅僅是發現的詞的數量或者當沒有詞被發現時爲0,劑量有詞。 printsummary()和wordfoundYN與此代碼位無關。另外在我的消息[]中是一段,用\n
和東西。單詞搜索字符串操作
因此,基本上這段代碼目前正常運行,它會在消息[]數組中找到關鍵字並返回這些字的起始位置,並將它們放入關鍵字at []中。然後,爲了只打印1行我回去,直到前面的\n
字符的話,我只需打印,直到下一個\n
字符,因此打印出來的字被包含在該段線路。
但是我有一個問題,讓假設我們假設message[]={"\n the cat is in the bag.\n"}
,然後用戶輸入搜索單詞爲「the」,它會在段落中打印同一行兩次,因爲它在該句子中發現了兩次單詞,keywordsat []將填充2個數字keywordsat [0] = 1和keywordsat [1] = 16。我想知道是否有這個程序知道,如果兩個單詞在同一行,不打印同一行兩次?
...
searchwordYN=searchword();
if(searchwordYN!=0){
printsummary(d);
wordfoundYN++;
counter=0;
while(counter<searchwordYN){
i=keywordsat[counter];
while(i>=0){
if(message[i]=='\n'){
break;
}
i--;
}
for(f=i+1;f<10485760;f++){
if(message[f]=='\n'){
break;
}
printf("%c", message[f]);
}
printf("\n");
counter++;
}
counter=0;
}
...
我的搜索內容()函數:
int searchword(){
char *ret;
int i=0;
ret = strstr(message, keyword);
if(ret==NULL){
return 0;
}
while(ret!=NULL)
{
keywordsat[i]=ret-message;
i++;
ret++;
ret = strstr(ret, keyword);
}
return i;
}
一個問題是你有太多的縮進級別的舒適度。你應該着眼於將你的代碼重構成更小的函數。在第一個片段中只有6個縮進級別,看起來它可能在3或4個縮進級別,然後才能到達該代碼。害怕!很難準確管理。 – 2014-10-22 05:22:50