2015-04-07 80 views
2

我有以下形式的字符串:保留在字符串++只需要字符用C

http://stackoverflow.com/q""uestions/ask/%[email protected]

現在我想刪除該字符串的所有字符,除了字母數字的和://.So,輸出字符串變成:

http://stackoverflow.com/questions/ask/33854/á 

我知道我可以遍歷這個字符串的字符,並刪除不必要的字符。但是有些標準庫中的某些功能可以幫助我刪除不需要的字符。如果我知道不需要的字符,那麼我可以使用std :: remove和std :: replace來選擇性地刪除或替換。但在這裏,我不知道未知的角色,我只知道我想保留的角色。

是否有某種方法可以僅保留必要的字符並刪除不需要的字符。我現在用

gcc版本是: 海合會(GCC)4.4.7 20120313(紅帽4.4.7-4)

編輯:我也想包括像一個字符。我不知道他們叫什麼。我知道他們不是阿爾卑斯數字。但我沒有得到如何檢查他們

+1

C或C++?或兩者?您的標題僅提及C++ –

回答

-1

你可以嘗試這樣的事情:

std::string str ("This is an example sentence."); 
    std::cout << str << '\n'; 
              // "This is an example sentence." 
    str.erase (10,8);      //   ^^^^^^^^ 
    std::cout << str << '\n'; 
              // "This is an sentence." 
    str.erase (str.begin()+9);    //   ^
    std::cout << str << '\n'; 
              // "This is a sentence." 
    str.erase (str.begin()+5, str.end()-9); //  ^^^^^ 
    std::cout << str << '\n'; 
              // "This sentence." 
1

但在這裏我不知道未知的人物,我只知道,我想保留的角色。

例如,使用char數組將白名單列入要保留的字符。然後遍歷字符串中的每個字符,如果它不在白名單中,則將其刪除。

2

你會想要使用std::remove_if並定義一個謂詞返回false只有當字符是你想保留的字符。

在完成此過程後,您還需要將字符串調整爲新的長度。舉個例子:

#include <string> 
#include <algorithm> 
#include <iostream> 
#include <locale> 

bool is_special_char(char c) 
{ 
    return !(std::isalnum(c) || c == ':' || c == '/' || c == '.'); 
} 

int main() 
{ 
    std::string s = "http://stackoverflow.com/q\"\"uestions/ask/\%[email protected]"; 

    std::cout << s << std::endl; 

    std::string::iterator new_end = std::remove_if(s.begin(), s.end(), is_special_char); 
    s.resize(new_end - s.begin()); 

    std::cout << s << std::endl; 
} 

將輸出

http://stackoverflow.com/q""uestions/ask/%[email protected] 
http://stackoverflow.com/questions/ask/33854 

如果要合併的Unicode字符,則需要使用wstring,而不是字符串,用這個(並納入Wintermute真好使用的一個例子擦除/刪除成語)將是。

#include <string> 
#include <algorithm> 
#include <iostream> 
#include <locale> 

bool is_special_char(wchar_t c) 
{ 
    return !(std::iswalnum(c) || c == ':' || c == '/' || c == '.'); 
} 

int main() 
{ 
    std::locale::global(std::locale("en_US.UTF-8")); //Set the global locale to Unicode 
    std::wstring s = L"http://stáckoverflow.com/q\"\"uestions/ask/%[email protected]"; 

    std::wcout << s << std::endl; 

    s.erase(std::remove_if(s.begin(), s.end(), is_special_char), s.end()); 

    std::wcout << s << std::endl; 
} 

將輸出

http://stáckoverflow.com/q""uestions/ask/%[email protected] 
http://stáckoverflow.com/questions/ask/33854 
+1

,並隨後調整大小... – fjardon

+0

「á」。我有像「á」這樣的角色。它們不是字母數字,但我想保留它們,我如何在我的is_special_character函數中指定它 –

+0

我已經使用語言環境和wstrings添加了一個示例來支持unicode字符。 –

3

因爲你的編譯器是古代和正則表達式的支持是GCC比較近(從GCC 4.9前鋒),正則表達式是不是一種選擇。我們將使用帶有命名函數的erase-remove idiom,因爲Gcc 4.4尚不支持lambdas。

#include <algorithm> 
#include <iostream> 
#include <locale> 
#include <string> 

// true for characters that should be removed 
bool is_special_character(char c) { 
    std::locale loc("your_locale_string_here"); 
    return !std::isalnum(c, loc) && c != ':' && c != '/' && c != '.'; 
} 

int main() 
{ 
    std::string s = "http://stackoverflow.com/q\"\"uestions/ask/%[email protected]"; 

    // interesting part here 
    s.erase(std::remove_if(s.begin(), s.end(), is_special_character), s.end()); 

    std::cout << s << '\n'; 
} 
+0

「á」。我有像「á」這樣的角色。它們不是字母數字的,但我想保留它們,我如何在我的is_special_character函數中指定此內容 –

+0

您可以使用'std :: locale'和使用它的'std :: isalnum'重載(請參閱編輯)。你將不得不放置(系統相關的)區域設置字符串才能工作。你也可以手動檢查字符,但這會更乏味。 (順便說一句,你可能也想保留'.';我把它放進去的時候) – Wintermute

+0

我對我的問題有一點點修改..我很抱歉爲後期更新 –

相關問題