好,再下來我們要說怎麼樣比較兩個字串。那
比較兩個字串甚麼意思呢?就是說我們拿兩個字串來比,啊,看那個結果, 如果前面的字串比較小那回傳一個負數,
如果前面的字串比較大那回傳一個正數,如果兩個字串一樣大的話就回傳一個0。那甚麼叫一樣
大或者說是比較小,比較大?那兩個字串比較方法是說從頭開始比,比第一個字元,
第一個字元如果就比出大小來的話,那就那個按照第一個字元的大小,如果第一個字元
沒有辦法比出大小,那就看第二個字元,這樣一直下去。那呃,
甚麼叫兩個字元比較大小呢?這時候我們就看它的ASCII值,這個ASCII值的話
就是0到那個127這個對照表。
那我們就看它之前的方法,就是說按照ASCII的值來比。那這邊值得特別注意的地方事實上
是小寫字母那個ASCII值事實上是比較大的,所以你拿小寫字母去跟大寫字母比的話, 是小寫字母比較大。這可以,各位可以回去查一下那個表啊。
那另外有一個版本是strncmp,就多了一個n,
這跟那個strcmp跟strncmp一樣,就是說它最多就是比n個。
比如果還一樣就一樣,後面就不比了。
那我們現在利用這個比較的方法來做一個字串的排序。那字串排序甚麼意思呢?
我們現在把十二生肖的字串放在一個二維陣列裡頭,這二維陣列甚麼意思呢?第一維就代表十- 二個生肖,
第二維代表那個生肖的字串iii那個裡面的字元。那我們用兩個回圈來做那個之前說過
那個泡沫排序法,那第一層決定兩兩交換的範圍,第二層決定實際上來做那個兩兩交換。
那我們怎麼做兩兩交換?我們記不記得我們泡沫排序法必須說,兩個東西要比大小,
這時候strcmp就派上用場了,所以我們就用strcmp來比較兩個生肖的字串。
好這是程式前面主要是宣告的部分,我們會用兩個rodiac二維的陣列,rodiac這- 有十二個,
有十二個,因為我們十二生宵。然後每一個生肖它那個
字串的字元數,它事實上不超過四十,我們就用四十作為一個範例,放到四十就夠了,
然後這些坐標把它放好,然後還有一個很重要就是說我們要放一個temp。
這個等下會用到說,當我們要交換兩個那個生肖的那個,
那個字串的時候我們就用這個作為那個暫存, 所以一開始我們把這個生肖讀進來,零到十一把它讀進來。
那這個就是我們鼠牛虎兔就這樣一直把那個十二生肖把它讀進來,讀進來。
然後我們希望出來是這個樣子,按照這個東西來排序,按照這個來排序。所以說是小寫字母,
然後按照這個字母順序來排序,所以可以看到排好序以後,
那個狗是最大的,dog是最大的,因為d比任何一個其它的都要來的前面,那o是在r- 的前面,
所以dog會在dragon之前,因為這個o比r當然是小。
那a也比o在前面所以 那個hare跟那個horse是hare在前面。
好,那 做完這件事情以後吶,做完這個輸入以後吶,我們就想要怎麼樣來做這個事情。那我麼做的方-
法就是用那個 那個字串的那個排序。那我們先看,就是說我們先把i的範圍先弄好。
i的範圍我們這邊是由後面這樣減過去,由10一直減,一直減,減,一直減,
減到1。那這又是甚麼意思呢?因為我們的坐標是從0到11, 所以最後一次比的時候我們是10比11,所以我們是這樣來做。
要是我們是10跟i,跟i 那個指到的範圍後面那個來做。那j呢,
j是從0一直到,那個一直到i,所以我們這個是告訴它說,
當我們每一次這樣比較的時候,最後一次比較的時候, 那個比較小那個是在哪裡,那第一個是在10,第二個是在9,這樣一直到底回來。
那我們每次看j,j吶從0一直到i,好一直到i。
那我們看說,這個j跟j+1是不是順序是對的,如果
那個前面的j比較大的話,這個怎麼看呢?因為它是大於0,如果前面比它大,
就把它調換過來,那怎麼調換呢?我們就用strcopy,記不記得我們用strcopy- ,把後面這個放到前面來,
好所以我們就按照那個之前片裡介紹的,怎麼樣把
三個東西換過來,只不過說我們之前是用指定,但是現在因為你有兩個陣列
要複製,所以你等於說把後面陣列複製到前面來的話,那你就用strcopy就好了,因為- 反正最後面的那個0,那看到了
會把它copy過去。那這樣的話我們字串的這種所謂的assignment就直接用st- rcopy就可以了。
這個你可以看到就是說j跟j+1把它換過來,把它換過來,因為它們順序是反的。
那裡面這個迴圈就是每一次從0一直到i,一直調過去,那第一次是到10,
第二次是到9,這個剛開始也說明過了。因為10的時候最後一個,所以10跟11換,- 是對的。
等它换完以后呢,再把所有的东西印出来,怎么印呢?
你就用printf然后放個s这样就可以印出来了,这之前说明过的。
那这边放,只放i的目的是因为zodiac是一個二维阵列,所以我當我告诉你它第i個的时- 候,事实上是告诉你
那個第幾排的開頭在哪里,那第幾排開頭在哪裡往後找自然就是找到它那個字串。
所以我們的输出就會變成這样,這是我们想要的,就是把它排好序。
那當然這樣做有一個問題就是說每一次那個字串在複製的時候要花
大量的時間,所以我們就想說,言外一個方法就是說我們只要用指標陣列
去換指標就好了,所以我們真正的字串呢還是一樣,放在這個zodiac裡頭,
還是一樣。但是吶我們用另外一個指標的陣列是指到它們, 意思就是說zptr1,
的0一直到11,會指到這個陣列的 第0排到第11排。等一下吶萬一這些順序有錯,
我們直接調換zptr裡頭的指標就可以了,這樣就不需要去做那個
strcopy了,我們只要換這裡頭的這個這個指標就好了,因為
我們到時候吶按照這個指標的順序拿的時候,因為指標的指向不一樣,所以它指的
那個字串就跟原來的範圍順序不一樣,這樣就可以達到這個排序的目的。
還是一樣把坐標先弄好,但這個時候我們temp呢,是一個
那個字元的指標,因為等一下我們要在這裡頭每一個人跟它做交換,
所以一開始吶我們把它讀進來,讀進來的時候吶當然 正常是跟執行完全一樣,就是把那個zodiac把它讀進來,但是這邊要注意,這邊要注意,
我們特別把zptr的第i個指到那個 zodiac裡頭的第i個,zodiac不是一個二維陣列嘛,
所以當你說第i個的時候,事實上就是第i排的起點。
所以我們用那個zptr把它指到了。
等一下吶還是一樣在做這個比較,但是注意到說, 我們現在就不管這個字串以後實際的內容了,
我們只管說這個pointer指到的地方是不是順序是對的。
如果順序不對,我們就把那個指標換過來就好了,
所以可以想象有兩個陣列哦。第一個陣列是存實際上是存放的一個字串,第二個陣列是放這些
指標的。因為指標當初指到就是指到這些字串的起點,所以它就代表那個 字串。如果說,如果說它們的
順序不對的話,我就把指標的值做些調換,那自然就ok了。
那這個原理就是這樣子。所以我們現在就不用strcopy,
因為strcopy它要花蠻多時間的,我們就直接置換這些字串的這個起點位置,
就用pointer來指到它,這樣就可以了。所以在這邊我們就可以看到說只用point- er的話事情上是蠻方便的,就是我們當初為甚麼要學習pointer,
就是我們可以使用pointer就直接做這個排序, 那最後吶我們就按照這個zptr的順序把它輸出就好了。
注意到如果你還是用這個zodiac的順序的話,那事實上那個順序是沒有排序的,
因為真正的順序是在zptr裡頭,那些指標的順序才是按照我們剛剛
就在做那個bubble source的時候這樣排好順序。所以你把這個東西把它排出來,這樣就可以了。