C中strstr()中for循环的使用不正确

时间:2014-06-10 07:51:53

标签: c string loops strstr

我正在尝试用C学习字符串处理。我写了一个程序,它存储了一些音乐曲目,并帮助用户检查他/她想到的歌曲是否存在于存储的曲目中。这是通过要求用户输入字符串来完成的。然后程序使用strstr()函数检查输入的单词/文本是否与任何轨道上的任何单词/文本匹配,如果是,则显示轨道号和名称。

我编写的代码在一开始就正常运行。但这是一个很大的缺陷,这是由于for循环使用不当造成的。我将首先显示程序和两个输出

#include<stdio.h>
#include<string.h>

//Define tracks array
char tracks[][80]={     //[][80] is a 2D array- for storing tracks and the size of each track, which is 80 at max
"I left my heart in Harvard med school",
"Newark, Newark- a wonderful town",
"Dancing with a dork",
"From here to maternity",
"The girl from Iwo Jima",
};

//Define function to search for text in tracks array

void findTrack(char search_for[])
{
    int i;
    for(i = 0; i < 5; i++)
    {
       if(strstr(tracks[i], search_for))    
       {
          printf("\n Match found\n");       
          printf("\n Track[%i]: %s\n", i, tracks[i]);
          break;
       }
       else
           printf("\n No matching tracks found!");
       }
}

int main()
{
   char search_for[80];
   printf("\n Enter the text to search:\n");
   scanf("%79s", search_for);
   findTrack(search_for);
   return 0;
}

第一次输出 -

 Enter the text to search:
Harvard

 Match found

 Track[0]: I left my heart in Harvard med school

如您所见,此输出是正确的。单词Harvard出现在我存储在tracks数组中的第一首曲目中。这是在for loop函数内findTrack的第一次迭代中找到的,因此输出正确。

但是,如果我再次运行该程序,这次我将文本搜索为town,结果输出为 -

第二输出 -

Enter the text to search:
town

 No matching tracks found!
 Match found

 Track[1]: Newark, Newark- a wonderful town

发生这种情况是因为在for循环的第一次迭代即tracks[0]时,strstr未找到任何匹配项,因此它在else中打印了该语句循环的一部分。当循环完成迭代1时,对于tracks[1],在town中找到匹配,因此它打印了循环的if部分。

同样,如果我再次运行程序并将Jima作为要搜索的文本,则输出为 -

 Enter the text to search:
Jima

 No matching tracks found!
 No matching tracks found!
 No matching tracks found!
 No matching tracks found!
 Match found

 Track[4]: The girl from Iwo Jima 

我认为这个缺陷是由于错误的for循环造成的。但我不确定如何正确使用for循环。任何有关纠正此事的建议都将受到高度赞赏。 谢谢!

修改

在我的代码中,我使用for循环i<5,因为我知道我的程序中存储了5 tracks。但是,更好的编码方法是运行循环,而不管/当轨道数量未知时。这可能发生在我的轨道数量发生变化的情况下,因此每次更改for循环都是低效的。有关如何实施此更改的任何建议吗?

3 个答案:

答案 0 :(得分:2)

您只想在检查整个数组Not found以进行匹配后打印tracks。所以你可以使用一个标志并在循环后检查它:

void findTrack(char search_for[])
{
  int i;
  int found = 0;
  for(i=0;i<5;i++)
  {
    if(strstr(tracks[i], search_for))   
    {
    found = 1;
    printf("\n Match found\n");     
    printf("\n Track[%i]: %s\n", i, tracks[i]);
    break;
    }
  }
  if (!found)     printf("\n No matching tracks found!");
}

答案 1 :(得分:0)

你可以这样做:

for (i = 0; i < 5; i++) {
    if (strstr(tracks[i], searchfor) {
        printf("\nMatch found\n);
        printf("Track[%n]: %s", i, tracks[i]);
        return;
    }
}
printf("\nNo matching tracks found!");

答案 2 :(得分:0)

要适应变量类型,可以使用define

#define TRACKS 5

在包含之后...当您想要更改金额时,您只需要将该值更改为新值。

 void findTrack(char search_for[])
 {
    int i;
    int found = 0;
    for(i = 0; i < TRACKS; i++)
    {
       if(strstr(tracks[i], search_for))   
       {
           found = 1;
           printf("\n Match found\n");     
           printf("\n Track[%i]: %s\n", i, tracks[i]);     
           //break;
       }
    }

    if (!found)     printf("\n No matching tracks found!");
  }

我评论了休息时间,因为这取决于你想要做什么......如果你想找到只有第一个的音轨,你应该让它休息一下但是如果你想找到所有匹配,那么在找到第一个匹配后你就不应该破解。