اين تابع دو رشته را دريافت و در رشته اول به دنبال رشته دوم جستجو مي كند و در صورت پيدا شدن، مكان اولين كاراكتر آن را باز مي گرداند. در صورتيكه در رشته اول چندين نمونه از رشته دوم وجود داشته باشد، مكان اولين نمونه را باز مي گرداند. پياده سازي اين تابع در زير آمده است:
کد:void strstr(const char str1[], const char str2[]) { int i, j ; for (i=0; str1[i]; i++) if (str1[i] == str2[0]) { for (j=1; str2[j] && str1[i+j] == str2[j] ; j++) ; if (!str2[j]) return(i); } return(-1) ; }
درك نحوه كار اين تابع نياز به دقت دارد. حلقه for اول تك تك عناصر str1 را با اولين عنصر str2 مقايسه مي كند. چنانچه يكي از اين عناصر با str2[0] برابر بود، آنگاه حلقه for دوم شروع به مقايسه عناصر بعدي str1 (از محل i به بعد) و str2 (از محل 0 به بعد) مي نمايد. به شرط حلقه for دوم دقت كنيد. اين حلقه تا زمانيكه str2 به انتها نرسيده و همچنين عنصر بعدي str2 و str1 با يكديگر برابر باشند، تكرار مي گردد. دقت كنيد كه بدنه حلقه خالي است. بعد از پايان حلقه بررسي مي گردد كه چنانچه دليل خروج از حلقه به پايان رسيدن str2 بوده است (يعني str2[j] برابر null شده است)، بنابراين رشته مورد نظر پيدا شده و مكان شروع آن يعني i بازگردانده مي شود. در غير اينصورت، دليل خروج مساوي نبودن دو كاراكتر از دو رشته بوده است، بنابراين عمليات جستجو ادامه مي يابد. البته تابع فوق بهينه نيست. چرا كه هنگامي كه در رشته اول، شمارنده به مكاني برسد كه تعداد كاراكترهاي باقيمانده تا پايان رشته كمتر از اندازه رشته دوم باشد، قطعا ادامه جستجو لزومي ندارد، چرا كه رشته دوم پيدا نخواهد شد.
براي روشن شدن موضوع، به برنامه زير دقت كنيد:(دريافت برنامه)
کد:void main() { char text[100], word[20]; int i, n, result ; printf("enter a text : "); gets(text) ; printf("how many words do you have : "); scanf("%d",&n) ; for (i=0; i<n; i++) { printf("enter a word to search : ") ; gets(word); result = strstr(text, word) ; if (result == -1) printf("(%s) not foundn",word); else printf("(%s) is founded in position %dn", word, result); } }
علاقه مندی ها (Bookmarks)