簡體   English   中英

C中strstr()中for循環的錯誤用法

[英]Incorrect usage of a for loop in strstr() in C

我正在嘗試學習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

如您所見,此輸出是正確的。 我在tracks數組中存儲的第一條曲目中出現了Harvard一詞。 這是在findTrack函數內部for loop的第一次迭代中找到的,因此是正確的輸出。

但是,如果我再次運行該程序,這次我將文本輸入為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循環正確地進行操作。 任何糾正此問題的建議將不勝感激。 謝謝!

編輯

在我的代碼中,我使用了i<5for循環,因為我知道程序中存儲了5 tracks 但是,一種更好的編碼方式將是運行一個循環,而無論/在軌道數量未知的情況下。 當我的音軌數量發生更改時,可能會發生這種情況,因此每次都不斷更改for循環會很低效。 有關如何實施此更改的任何建議?

檢查整個陣列tracks是否匹配后,只想打印Not found 因此,您可以使用標志並在循環后檢查它:

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!");
}

你可以做:

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!");

適應變量類型,您可以使用定義

#define TRACKS 5

在包含之后...只要您不想更改其他值,就只需將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!");
  }

我已經評論了中斷,因為這取決於您要執行的操作...如果您只想查找包含該單詞的第一首曲目,則應該讓中斷,但是如果您想查找所有匹配項,則不應該在findind第一個之后不休息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM