单词搜索字符串操作

时间:2014-10-22 05:18:37

标签: c arrays string loops printing

我所拥有的这段代码是一个更大的代码的一部分,但它的基本功能就是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;
}

1 个答案:

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

最后提示:

不要害怕将属性用于函数而不是使用全局变量。使它更好。