字符串面試題系列之五:刪除字符串空格


編譯環境

   本系列文章所提供的算法均在以下環境下編譯通過。

【算法編譯環境】Federa 8,linux 2.6.35.6-45.fc14.i686
【處理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【內存】 2025272 kB

前言

    無論是在面試當中還是在項目當中,去除多余的空格都是十分常見的。所以面試官或者筆試當中這個題目問的還是比較多的。即字符串左邊空格,右邊空格,然戶字符串中如果有幾個空格則合並成一個空格。筆者在寫一個命令行參數程序時,就覺得去除空格十分有用。比如,當用戶輸入一個命令及其參數的時候i,多一個空格或者多一個Tab很正常,這樣解析的時候就需要對輸入的字符串進行處理。這樣刪除字符串空格就顯得十分必要了。

    本系列文章均系筆者所寫,難免有一些錯誤或者紕漏,如果小伙伴們有好的建議或者更好的算法,請不吝賜教。

正文

【題目】

   寫一個去除字符串左邊空格,右邊空格,字符串中如果出現多個空格,則合並成一個空格的程序。。

【例子】

   輸入[ a b c ],則輸出abc。

【分析】

   本題思路很簡單,,對字符串掃描一遍即可完成功能。怎么做的呢?好,我們考慮三個步驟,第一個步驟是去掉左邊空格;第二個步驟是去掉中間空格;第三個步驟是去掉右邊空格;我們讓i指向字符串首地址,這個指針是專門存儲字符的,用j來掃描空格。如果j指向空格,則直接跳過,如果遇到字符,就將其復制到i的位置,i指向下一個位置。對於中間的空格,j掃描,直到遇到非空格字符停止,在i的位置上加一個空格再加一個字符,這就是多個空格合並成一個空格。末尾的空格j顯然都是直接忽略不計的。最后記得要新位置上要補上'\0'噢。下圖顯示的就是算法的過程:

8

算法的文字描述如下:第一步:初始化:用i指針控制輸出開始為0,j指針從0處開始掃描;
第二步:左邊空格:當j遇見第一個不是空格的字符,賦給i處.i指向下一位;
第三步:中間以及后面空格:繼續掃描,如果遇見空格則賦給i處,i指向下一位,后面空格就忽略直到下一個不是空格字符賦給i處,i指向下一位。
第四步:給字符串加一個'\0'並且返回。算法結束。

【代碼】

#include <iostream>
#include <cstring>

char * del_space( char * const string )
{
   char *p = string;
   int j = 0;
   // delete left space
   while( *p == ' ' )
   {
      p++;
   }
   // delete spaces among characters
   while( *p != '\0' )
   {
      if( *p != ' ' )
      {
         string[j++] = *p;
      }
      else
      {
         while( *p == ' ' )
         {
            p++;
         }
         string[j++] = ' ';
         p--;
      }
      p++;
   }
   string[j] = '\0';
   return string;
}

int main( int argc, char ** argv )
{
   char string[] = "    Hello my    word !    ";
   char * result = del_space( string );
   std::cout << result << std::endl;
}

【結論】

 

作者

   出處:http://www.cnblogs.com/gina

   本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM