前言
上一篇《C算法編程題(五)“E”的變換》
連續寫了幾篇有關圖形輸出的編程題,今天說下有關字符串的處理。
程序描述
在實際的開發工作中,對字符串的處理是最常見的編程任務。本題目即是要求程序對用戶輸入的串進行處理。具體規則如下:
1. 把每個單詞的首字母變為大寫。
2. 把數字與字母之間用下划線字符(_)分開,使得更清晰
3. 把單詞中間有多個空格的調整為1個空格。
例如:
用戶輸入:
you and me what cpp2005program
則程序輸出:
You And Me What Cpp_2005_program
用戶輸入:
this is a 99cat
則程序輸出:
This Is A 99_cat
我們假設:用戶輸入的串中只有小寫字母,空格和數字,不含其它的字母或符號。每個單詞間由1個或多個空格分隔。
假設用戶輸入的串長度不超過200個字符。
程序實現
這個題目看起來很簡單,但是想一想,用C的簡單語法實現起來還是有些麻煩的,畢竟沒有.net里面那么多字符串處理的方法。
題目就三個要求,就是字符轉換和處理,感覺簡單,但是卻無從下手。
還是那句話,做這種編程題,思路清晰了,代碼才好實現。這里我說一種思路,如果大家有更好的,歡迎交流。
如果轉換、移除和插入一個字符,就必須知道上一個字符和下一個字符是什么,比如第二點要求,就得知道上一個字符是英文下一個字符是數字或是上一個字符是數字下一個字符是英文,第三點也是,去空格就得知道上一個和下一個字符都是空格,第一點也是如此,變大寫就得索引是0或是上一個字符是空格和下一個字符是字符。
思路就是這樣,理清了就會發現很簡單了,然后就是一些細節處理了。
代碼我就不分析了,直接貼下代碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 void main() 5 { 6 char strArray[200] = {0}; 7 char strResult[400] = {0}; 8 int i=0,j=0,Len; 9 int nMark = 0; 10 11 printf("請輸入字符串:\n"); 12 gets(strArray); 13 14 Len = strlen(strArray); 15 16 while(i<Len) 17 { 18 switch(nMark) 19 { 20 case 0: 21 { 22 if(strArray[i]>='a'&&strArray[i]<='z') 23 { 24 strResult[j++] = strArray[i++]-'a'+'A'; 25 nMark = 1; 26 } 27 else if(strArray[i]>='0'&&strArray[i]<='9') 28 { 29 strResult[j++] = strArray[i++]; 30 nMark = 2; 31 } 32 else if(strArray[i]==' ') 33 { 34 strResult[j++] = strArray[i++]; 35 nMark = 0; 36 } 37 } 38 break; 39 case 1: 40 { 41 if(strArray[i]>='a'&&strArray[i]<='z') 42 { 43 strResult[j++] = strArray[i++]; 44 nMark = 1; 45 } 46 else if(strArray[i]>='0'&&strArray[i]<='9') 47 { 48 strResult[j++] = '_'; 49 strResult[j++] = strArray[i++]; 50 nMark = 2; 51 } 52 else if(strArray[i]==' ') 53 { 54 strResult[j++] = strArray[i++]; 55 nMark = 3; 56 } 57 } 58 break; 59 case 2: 60 { 61 if(strArray[i]>='a'&&strArray[i]<='z') 62 { 63 strResult[j++] = '_'; 64 strResult[j++] = strArray[i++]; 65 nMark = 1; 66 } 67 else if(strArray[i]>='0'&&strArray[i]<='9') 68 { 69 strResult[j++] = strArray[i++]; 70 nMark = 2; 71 } 72 else if(strArray[i]==' ') 73 { 74 strResult[j++] = strArray[i++]; 75 nMark = 3; 76 } 77 } 78 break; 79 case 3: 80 { 81 if(strArray[i]>='a'&&strArray[i]<='z') 82 { 83 strResult[j++] = strArray[i++]-'a'+'A'; 84 nMark = 1; 85 } 86 else if(strArray[i]>='0'&&strArray[i]<='9') 87 { 88 strResult[j++] = strArray[i++]; 89 nMark = 2; 90 } 91 else if(strArray[i]==' ') 92 { 93 i++; 94 nMark = 3; 95 } 96 } 97 break; 98 default: 99 break; 100 } 101 } 102 103 puts("轉換后的字符串為:"); 104 printf("%s",strResult); 105 106 getchar(); 107 }
運行結果: