C語言字串處理相關問題
在最近翻閱《C程式設計》一書時,在6.3.7節字串陣列應用舉例中我發現了一個值得學習的例子。
題目如下:輸入一行字元,統計其中有多少個單詞,單詞之間用空格隔開
這個程式的設計思路並不難,我們對單詞的特性很清楚,只要有空格說明出現了單詞數量變化。而為了避免因為輸入不規範出現多個空格影響單詞個數判斷錯誤,所以應該有兩個判斷條件共同判斷。在迴圈中,第一次判斷為此處是否為空格,如果是,就說明這個位置沒有單詞,單詞符“word”賦0,如果不是,就說明這個地方有字母,再進行第二次判斷,這次是關於”word“值的判斷,如果為0說明這個位置為一個單詞的開頭,單詞數加一。如果"word"值不為0,說明這個位置之前還有字母,在這之前為一個單詞的開頭,這個位置不需要再計算單詞數。
程式碼如下:
#include <stdio.h>
int main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
{
if(c==' ')word=0;
else if(word==0)
{
word=1;
num++;
}
}
printf("There are %d words in this line.\n",num);
return 0;
}
執行結果:
程式分析:我認為這個程式設計思路的特點在於解決了利用之前迴圈結果來對當前迴圈進行處理的問題,具體體現在對"word"的賦值使用中。本程式通過第一次判斷,來確定每一次迴圈所在位置是否有字母,有字母的更進一步意義就是這個位置有單詞,word置1(這個步驟在第二個迴圈中),而如果是空格,說明這個位置沒有單詞,word置1。通過對word賦值的不斷改變,我們可以“保留”上一次迴圈的結果,這樣能完成我們對單詞首字母的尋找。
對於字串,我們想做的當然不止步於數有多少個單詞,在《C程式設計》一書中,在上文所述問題之後是一個找最大字串的問題(例6.9),這個問題很簡單,在這裡我就不過多贅述了,但由此延伸,我們不難想到多個字串陣列排序問題。在之前我有說過選擇法對姓名排序的方法,就是對應著這個問題,這一次我將採用冒泡法處理它。
程式碼如下:
#include "stdio.h"
#include "string.h"
int main()
{
char str[4][10];
char h[10];
for(int i=1;i<4;i++)
{
printf("第%d個字串為" ,i);
gets(str[i]);
}
for(int j=1;j<4;j++)
for(int k=1;k<4-j;k++)
{
if(strcmp(str[k],str[k+1])>0)
{
strcpy(h,str[k]);
strcpy(str[k],str[k+1]);
strcpy(str[k+1],h);
}
}
printf("由小到大排列為:");
for(int i=1;i<4;i++)
{
puts(str[i]);
}
return 0;
}
冒泡法的核心思想是逐個位置確定。具體來說對n個元素構成的陣列,迴圈(n-1)次。第一次迴圈比較(n-1)次,確定第n個元素,第二次迴圈比較(n-2)次,確定第(n-1)個元素,依此類推,直至全部確定下來。這個過程需要用到兩個迴圈巢狀,是較難思考的部分,上述程式中這段程式碼為:
for(int j=1;j<4;j++)
for(int k=1;k<4-j;k++)
{
if(strcmp(str[k],str[k+1])>0)
{
strcpy(h,str[k]);
strcpy(str[k],str[k+1]);
strcpy(str[k+1],h);
}
}
對於字串的處理,其實只是多出了strcpy函式(因為字串陣列不能直接賦值)。總體思路難在巢狀迴圈的迴圈判別式上。
執行結果: