自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【字符串處理算法】將輸入字符串中的各個(gè)單詞反序的算法設(shè)計(jì)及C代碼實(shí)現(xiàn)

開發(fā) 開發(fā)工具 算法
今天講一講將輸入字符串中的各個(gè)單詞反序的算法設(shè)計(jì)及C代碼實(shí)現(xiàn)。

一、需求描述

輸入一個(gè)字符串,編寫程序?qū)⒃撟址械母鱾€(gè)單詞反序拼裝并輸出。例如,如果輸入的字符串是“Hello, how do you do”,那么輸出的字符串為“do you do how Hello,”。注意保留各個(gè)單詞之間的空格及相應(yīng)的標(biāo)點(diǎn)符號(hào)。

字符串代碼

二、算法設(shè)計(jì)

通過觀察示例字符串(即“Hello, how do you do”),我們可以看到該字符串中各個(gè)單詞與空格之間的關(guān)系為:單詞總數(shù)=空格總數(shù)+1。也就是說,示例字符串中的空格總數(shù)為4,單詞個(gè)數(shù)為5(即“Hello,”、“how”、“do”、“you”、“do”)。

因此,我們可以考慮先找出輸入字符串中的空格總數(shù),再根據(jù)空格找出各個(gè)單詞,然后將這些單詞反序拼裝起來。

程序的總體流程如圖1所示。

圖1 程序的總體流程

三、特殊流程考慮

在編寫程序的過程中,我們要對(duì)輸入字符串的格式多做考慮,如:

1.輸入字符串的開頭幾個(gè)字符為空格,即形如“ Hello,how do you do”,我們需要先將開頭的幾個(gè)空格去掉,再進(jìn)行后續(xù)處理。

2.輸入字符串的結(jié)尾幾個(gè)字符為空格,即形如“Hello, how do you do ”,我們需要先將結(jié)尾的幾個(gè)空格去掉,再進(jìn)行后續(xù)處理。

3.輸入字符串的中間幾個(gè)字符為連續(xù)的空格,即形如“Hello, how do youdo”,我們需要先將連續(xù)的空格合并為一個(gè)空格,再進(jìn)行后續(xù)處理。

4.只要輸入字符串中的兩個(gè)單詞之間出現(xiàn)了空格,我們都把它們當(dāng)作兩個(gè)不同的單詞,即使這兩個(gè)單詞沒有實(shí)際的意思,即形如“Hello, how do y ou do”,其中的“y”和“ou”雖然要合并在一起才有意義,但我們?nèi)匀话凑諆蓚€(gè)不同的單詞進(jìn)行處理。

四、程序代碼

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱: ReverseTheString.c 
  4. * 文件標(biāo)識(shí): 無 
  5. * 內(nèi)容摘要: 將字符串中的單詞反序 
  6. * 其它說明: 例如, 將"I'm a student"轉(zhuǎn)變?yōu)?quot;student a I'm" 
  7. * 當(dāng)前版本: V1.0 
  8. * 作    者: Zhou Zhaoxiong 
  9. * 完成日期: 20160215 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <stdlib.h> 
  13.  
  14. // 重新定義數(shù)據(jù)類型 
  15. typedef signed   char       INT8; 
  16. typedef unsigned short int  UINT16; 
  17. typedef          int        INT32; 
  18. typedef unsigned int        UINT32; 
  19.  
  20. // 函數(shù)聲明 
  21. INT32 GetFieldFromString(INT8 *pszIn, INT8 cSplitter, UINT16 iIdx, INT8 *pszOut, UINT16 iLen); 
  22. void CombineSpace(INT8 *pszOldStr, INT8 *pszNewStr); 
  23.  
  24.  
  25. /********************************************************************** 
  26. * 功能描述: 主函數(shù) 
  27. * 輸入?yún)?shù): 無 
  28. * 輸出參數(shù): 無 
  29. * 返 回 值: 0-執(zhí)行成功   其它-執(zhí)行失敗 
  30. * 其它說明: 無 
  31. * 修改日期        版本號(hào)     修改人            修改內(nèi)容 
  32. * --------------------------------------------------------------------- 
  33. * 20160215        V1.0     Zhou Zhaoxiong        創(chuàng)建 
  34. ***********************************************************************/ 
  35. INT32 main() 
  36.     INT8   szTestStr[500]   = {0}; 
  37.     INT8   szTmpStr[500]    = {0};  // 用于存放經(jīng)過規(guī)范化處理之后的字符串 
  38.     INT8   szResultStr[500] = {0}; 
  39.     INT8   szFieldVal[100]  = {0}; 
  40.     INT32  iPosFlag         = 0
  41.     INT32  iRetFlag         = 0
  42.     UINT32 iBlankCount      = 0
  43.      
  44.     printf("Please input the string: \n"); 
  45.     gets(szTestStr); 
  46.     printf("TestStr=%s\n", szTestStr); 
  47.      
  48.     // 去除測試字符串中多余的空格及前后的空格 
  49.     CombineSpace(szTestStr, szTmpStr); 
  50.      
  51.     // 獲取測試字符串中的空格字符的個(gè)數(shù) 
  52.     iPosFlag = 0
  53.     while (szTmpStr[iPosFlag] != '\0') 
  54.     { 
  55.         if (szTmpStr[iPosFlag] == ' ') 
  56.         { 
  57.             iBlankCount ++; 
  58.         } 
  59.          
  60.         iPosFlag ++; 
  61.     } 
  62.      
  63.     // 將測試字符串中的單詞按照反序來拼接 
  64.     strcat(szTmpStr, " ");   // 在測試字符串***面添加空格, 用于解析各個(gè)單詞 
  65.     for (iPosFlag = iBlankCount; iPosFlag >= 0; iPosFlag --) 
  66.     { 
  67.         memset(szFieldVal, 0x00, sizeof(szFieldVal)); 
  68.         iRetFlag = GetFieldFromString(szTmpStr, ' ', iPosFlag, szFieldVal, sizeof(szFieldVal)-1); 
  69.         if (iRetFlag != 0) 
  70.         { 
  71.             printf("Exec GetFieldFromString to get FieldVal failed!\n"); 
  72.             return -1; 
  73.         } 
  74.          
  75.         if (strlen(szResultStr) > sizeof(szResultStr)-1)     // 字符串超長, 直接退出 
  76.         { 
  77.             break; 
  78.         } 
  79.         else 
  80.         { 
  81.             strcat(szResultStr, szFieldVal);     // 將各個(gè)單詞拼接起來 
  82.             strcat(szResultStr, " ");            // 在各個(gè)單詞后面添加空格 
  83.         } 
  84.     } 
  85.      
  86.     if (szResultStr[strlen(szResultStr)-1] == ' ') 
  87.     { 
  88.         szResultStr[strlen(szResultStr)-1] = '\0';   // 去除***面的空格 
  89.     } 
  90.      
  91.     printf("ResultStr=%s\n", szResultStr); 
  92.  
  93.     return 0;             
  94.  
  95.  
  96. /********************************************************************** 
  97. * 功能描述: 從字符串中獲取字段的值 
  98. * 輸入?yún)?shù): 無 
  99. * 輸出參數(shù): 無 
  100. * 返 回 值: 0-執(zhí)行成功   其它-執(zhí)行失敗 
  101. * 其它說明: 無 
  102. * 修改日期        版本號(hào)     修改人            修改內(nèi)容 
  103. * --------------------------------------------------------------------- 
  104. * 20160215        V1.0     Zhou Zhaoxiong        創(chuàng)建 
  105. ***********************************************************************/ 
  106. INT32 GetFieldFromString(INT8 *pszIn, INT8 cSplitter, UINT16 iIdx, INT8 *pszOut, UINT16 iLen) 
  107.     INT8   *pszStart    = NULL
  108.     INT8   *pszEnd      = NULL
  109.     UINT16  iCount      = 0
  110.     UINT16  iFiledLen   = 0
  111.     INT8    szBuf[1024] = {0}; 
  112.  
  113.     if (NULL == pszIn || NULL == pszOut) 
  114.     { 
  115.         return -1; 
  116.     } 
  117.  
  118.     pszStart = pszIn
  119.     for (iCount = 0; iIdx != iCount; iCount++)   // for循環(huán)用于查找當(dāng)前字段的起始位置 
  120.     { 
  121.         pszStart = strchr(pszStart, cSplitter); 
  122.         if (NULL == pszStart) 
  123.         { 
  124.             break; 
  125.         } 
  126.         else 
  127.         { 
  128.             pszStart ++; 
  129.         } 
  130.     } 
  131.  
  132.     if (NULL == pszStart) 
  133.     { 
  134.         return -2; 
  135.     } 
  136.  
  137.     pszEnd = strchr(pszStart, cSplitter); 
  138.     if (NULL == pszEnd) 
  139.     { 
  140.         return -3; 
  141.     } 
  142.  
  143.     // 判斷長度大小, 防止拷貝字符串時(shí)越界 
  144.     if (pszEnd - pszStart > sizeof(szBuf)-1) 
  145.     { 
  146.         iFiledLen = sizeof(szBuf)-1; 
  147.     } 
  148.     else 
  149.     { 
  150.         iFiledLen = pszEnd - pszStart; 
  151.     } 
  152.      
  153.     strncpy(szBuf, pszStart, iFiledLen); 
  154.  
  155.     if (iLen < iFiledLen)   // 傳入的長度太小 
  156.     { 
  157.         return -4; 
  158.     } 
  159.  
  160.     strncpy(pszOut, szBuf, iFiledLen); 
  161.  
  162.     return 0; 
  163.  
  164.  
  165. /********************************************************************** 
  166. * 功能描述:合并多個(gè)連續(xù)空格為一個(gè), 并去掉首位的空格 
  167. * 輸入?yún)?shù):pszOldStr-合并空格之前的字符串 
  168. * 輸出參數(shù):pszNewStr-合并空格之后的字符串 
  169. * 返 回 值:無 
  170. * 其它說明:無 
  171. * 修改日期       版本號(hào)        修改人          修改內(nèi)容 
  172. * ------------------------------------------------------------------- 
  173. * 20160215       V1.0      Zhou Zhaoxiong       創(chuàng)建 
  174. ***********************************************************************/ 
  175. void CombineSpace(INT8 *pszOldStr, INT8 *pszNewStr) 
  176.     UINT32 iOldIndex        = 0
  177.     UINT32 iNewIndex        = 0
  178.     INT8   chSingleChar     = '\0'
  179.     INT8   iIsSpace         = 0
  180.     INT8   szTmpNewStr[100] = {0}; 
  181.  
  182.     if ((NULL == pszOldStr) || (NULL == pszNewStr)) 
  183.     { 
  184.         return; 
  185.     } 
  186.  
  187.     while ('\0' != (chSingleChar = pszOldStr[iOldIndex++])) 
  188.     { 
  189.         if (chSingleChar == ' ')   // 多個(gè)連續(xù)空格只保留一個(gè) 
  190.         { 
  191.             if (iIsSpace == 0) 
  192.             { 
  193.                 iIsSpace = 1
  194.                 szTmpNewStr[iNewIndex++] = chSingleChar; 
  195.             } 
  196.         } 
  197.         else 
  198.         { 
  199.             iIsSpace = 0
  200.             szTmpNewStr[iNewIndex++] = chSingleChar; 
  201.         } 
  202.     } 
  203.  
  204.     // 如果***一個(gè)字符是空格, 則將其去掉 
  205.     if (szTmpNewStr[strlen(szTmpNewStr)-1] == ' ') 
  206.     { 
  207.         szTmpNewStr[strlen(szTmpNewStr)-1] = '\0'; 
  208.     } 
  209.  
  210.     // 如果***個(gè)字符是空格, 則將其去掉 
  211.     if (szTmpNewStr[0] == ' ') 
  212.     { 
  213.         memcpy(pszNewStr, szTmpNewStr+1, strlen(szTmpNewStr)-1); 
  214.     } 
  215.     else 
  216.     { 
  217.         memcpy(pszNewStr, szTmpNewStr, strlen(szTmpNewStr)); 
  218.     } 
  219.  
  220.     return; 

五、程序測試

我們將編寫好的程序“ReverseTheString.c”上傳到Linux機(jī)器,并使用“gcc -g -o ReverseTheStringReverseTheString.c”命令對(duì)該程序進(jìn)行編譯,生成“ReverseTheString”文件。下面對(duì)程序進(jìn)行詳細(xì)的測試。

1.輸入字符串為“Hello, how do you do”時(shí),程序運(yùn)行情況如下:

  1. Please input the string: 
  2. Hello, how do you do 
  3. TestStr=Hello, how do you do 
  4. ResultStr=do you do how Hello, 

2.輸入字符串為“ Hello, how do you do”(注意,前面有兩個(gè)空格)時(shí),程序運(yùn)行情況如下:

  1. Please input the string: 
  2.   Hello, how do you do 
  3. TestStr=  Hello, how doyou do 
  4. ResultStr=do you do how Hello, 

3.輸入字符串為“Hello, how do you do ”(注意,后面有兩個(gè)空格)時(shí),程序運(yùn)行情況如下:

  1. Please input the string: 
  2. Hello, how do you do  
  3. TestStr=Hello, how do you do  
  4. ResultStr=do you do how Hello, 

4.輸入字符串為“Hello, how do you do”(注意,中間有連續(xù)的空格)時(shí),程序運(yùn)行情況如下:

  1. Please input the string: 
  2. Hello,  how do   you  do 
  3. TestStr=Hello,  howdo   you  do 
  4. ResultStr=do you do how Hello, 

5.輸入字符串為“Hello, ho w do yo u do”(注意,將幾個(gè)完整的單詞用空格分開)時(shí),程序運(yùn)行情況如下:

  1. Please input the string: 
  2. Hello, ho w do yo u do 
  3. TestStr=Hello, ho w do yo u do 
  4. ResultStr=do u yo do w ho Hello, 

可見,對(duì)于上面考慮到的幾種特殊情況,程序均能做出正確的處理。

六、需求擴(kuò)展

基于本文中的需求和程序,我們可考慮對(duì)需求進(jìn)行以下擴(kuò)展:

1.將反序之后的字符串的首字母大小,并將反序之前的首字母從大寫變?yōu)樾?,即?ldquo;Hello, how do you do”轉(zhuǎn)換為“Do you do how hello,”。

2.不改變?cè)址械?**的標(biāo)點(diǎn)符號(hào)的位置,即將“Hello, how do you do!”轉(zhuǎn)換為“do you do how Hello,!”。

 

3.將原字符串中的標(biāo)點(diǎn)符號(hào)去掉,即將“Hello, how do you do!”轉(zhuǎn)換為“do you do how Hello”。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號(hào):周氏邏輯(logiczhou)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2016-12-30 13:32:24

字符串算法代碼

2016-12-30 13:16:51

字符串算法代碼

2016-12-29 17:14:41

回文串算法代碼

2016-12-29 15:58:00

字符串子串算法

2016-12-29 17:07:59

字符算法代碼

2021-09-10 08:31:54

翻轉(zhuǎn)字符串單詞

2023-02-26 22:33:32

字符串排列算法

2009-08-11 10:26:49

C#算法C#字符串反轉(zhuǎn)

2013-05-06 10:54:08

字符串字符串匹配KMP算法

2023-12-15 10:27:01

暴力匹配算法Python字符串

2021-09-03 09:41:36

字符串時(shí)間復(fù)雜度

2013-05-06 10:49:21

Boyer-Moore算法字符串匹配

2021-09-07 09:23:07

C++字符串算法

2016-12-29 16:25:32

字符串算法代碼

2010-11-26 09:51:54

MySQL字符串

2023-04-11 08:54:57

字符串匹配算法

2021-08-26 05:08:25

相鄰重復(fù)項(xiàng)算法

2010-06-28 15:18:51

SQL Server

2012-01-11 09:15:45

Objective-C

2010-11-26 10:43:48

MySQL分割字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)