2012-11-16 69 views
-2

我希望做有以下原型C++函數:功能修剪非,字母,數字的字符數組的字符

char *trim(char *string) 

我想這個功能做的是以下幾點:

  • 修剪所有非,字母數字字符
  • 如果遇到了空間,這是修剪的空間和附加字符
  • 返回微調MED字符數組

實施例:

輸入:*&^[email protected]^ThisIsA#Test String;'{><,.

輸出:ThisIsATest

+1

而且你希望我們...? – SingerOfTheFall

+0

你的意思是'std :: string trim(char const * str)'? – avakar

+1

絕對可以在SO – billz

回答

0

不知道這是否是最好的方式,性能明智,但它是對我來說最合乎邏輯的方式。 copy_if似乎不存在。但看看ASCII表www.asciitable.com我遍歷字符數組,只將字母數字字符複製到我的字符串對象,直到我找到一個空格或到達數組的末尾。

char *trim(char *str) 
{ 
    std::size_t len = strlen(str); 

    string temp = ""; 

    for (size_t k = 0; k < len; k++) 
    { 
      // If space found end the process 
      if(str[k] == 32) 
      { 
       break; 
      } 
      else if ((str[k] >= 48) && (str[k] >= 57)) // numbers 
      { 
       temp += str[k]; 
      } 
      else if ((str[k] >= 65) && (str[k] >= 90)) // uppercase letters 
      { 
       temp += str[k]; 
      } 
      else if ((str[k] >= 97) && (str[k] >= 122)) // lowercase letters 
      { 
       temp += str[k]; 
      } 
    } 

    // Convert String to char* 
    char * writable = new char[temp.size() + 1]; 
    std::copy(temp.begin(), temp.end(), writable); 
    writable[temp.size()] = '\0'; 

    return writable; 
}   

上心字符串轉換爲char *從這裏convert-stdstring-to-const-char-or-char

3

一種選擇是std::copy_if到良好字符複製到一個返回緩衝器:

char *trim(const char *str) { 
    std::size_t len = strlen(str); 

    char *ret = new char[len + 1]{}; //allocate space and initialize 
    std::copy_if(
     str, //from beginning 
     std::find(str, str + len, ' '), //to first space (or end) 
     ret, //copy to beginning of buffer 
     isalnum //the alphanumeric characters 
    ); 

    return ret; //return the buffer 
} 

int main() { 
    std::cout << trim("ab$#h%#.s354,.23nj%f abcsf"); //abhs35423njf 
    std::cout << trim("adua9d8f9hs.f,lere.r"); //adua9d8f9hsflerer 
} 

注意我的例子完全忽略了事實您必須取消分配您在trim中分配的內存,在這種情況下可以,因爲程序會立即結束。我強烈建議您改爲使用std::string代替。由於std::beginstd::end的兼容性,它可以簡化trim的定義,併爲您管理內存。

+0

您需要強制選擇'isalnum()'的正確重載。我同意'string'它更好:'copy_if(s.begin(),find(s.begin(),s.end(),''),back_inserter(result),static_cast (isalnum));'或更普遍的'find_if()'和'isspace()'。 –

+0

@JonPurdy,你確定需要投射它嗎? GCC什麼都沒給我。無論如何,我確實考慮過'isspace',我同意它是一個合適的替代品。我很喜歡這個問題的措辭,但這是一個很好的提及。 – chris

+0

我不得不在Ideone上演員。不過,我把這個標題作爲''包括在內;如果您使用了'',那麼行爲可能會有所不同。 –