我所拥有的这段代码是一个更大的代码的一部分,但它的基本功能就是searchword();函数使用strstr查找与用户输入搜索词匹配的所有单词将单词的初始位置放入keywordsat []整数数组中,以便我可以将它用于文本的打印1行。什么是searchword();返回只是找到的单词数或0没有找到单词时,dosent有单词。 printsummary()和wordfoundYN与此代码位无关。另外我的消息[]是段落,\n
和东西。
所以基本上这段代码目前运行正常,它在message []数组中找到关键词,并返回单词的起始位置,将它们放入keywordsat []。然后,为了只打印1行,我回到上一个\n
字符,然后我只是打印到下一个\n
字符,从而打印出该单词所包含的段落的行。
但我有一个问题,我们假设我们假设message[]={"\n the cat is in the bag.\n"}
然后用户输入搜索单词为""它会在段落中打印相同的行两次,因为它在句子中找到了两次单词,keywordsat []将填充2个数字keywordsat [0] = 1和keywordsat [1] = 16。我想知道是否有任何方式让这个程序知道如果2个单词在同一行,不要打印同一行两次?
...
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;
}
...
我的searchword()函数:
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;
}
答案 0 :(得分:0)
一种方法是保存行的起始位置(i的值)
这样的事情可能有用:
searchwordYN=searchword();
if(searchwordYN!=0){
//old start of line needs to be initialized by something bigger than file size
int oldStartOfLine = 10485760 + 1;
printsummary(d);
wordfoundYN++;
counter=0;
while(counter<searchwordYN){
i=keywordsat[counter];
while(i>=0){
if(message[i]=='\n'){
break;
}
i--;
}
if( i != oldStartOfLine ){
// only do the print out if this is a new line.
for(f=i+1;f<10485760;f++){
if(message[f]=='\n'){
break;
}
printf("%c", message[f]);
}
}
printf("\n");
// save old start of line
oldStartOfLine = i;
counter++;
}
counter=0;
}
最后提示:
不要害怕将属性用于函数而不是使用全局变量。使它更好。