[英]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<5
的for
循環,因為我知道程序中存儲了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.