我希望做有以下原型C++函數:功能修剪非,字母,數字的字符數組的字符
char *trim(char *string)
我想這個功能做的是以下幾點:
- 修剪所有非,字母數字字符
- 如果遇到了空間,這是修剪的空間和附加字符
- 返回微調MED字符數組
實施例:
輸入:*&^[email protected]^ThisIsA#Test String;'{><,.
輸出:ThisIsATest
我希望做有以下原型C++函數:功能修剪非,字母,數字的字符數組的字符
char *trim(char *string)
我想這個功能做的是以下幾點:
實施例:
輸入:*&^[email protected]^ThisIsA#Test String;'{><,.
輸出:ThisIsATest
不知道這是否是最好的方式,性能明智,但它是對我來說最合乎邏輯的方式。 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
一種選擇是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::begin
和std::end
的兼容性,它可以簡化trim
的定義,併爲您管理內存。
您需要強制選擇'isalnum()'的正確重載。我同意'string'它更好:'copy_if(s.begin(),find(s.begin(),s.end(),''),back_inserter(result),static_cast
@JonPurdy,你確定需要投射它嗎? GCC什麼都沒給我。無論如何,我確實考慮過'isspace',我同意它是一個合適的替代品。我很喜歡這個問題的措辭,但這是一個很好的提及。 – chris
我不得不在Ideone上演員。不過,我把這個標題作爲'
而且你希望我們...? – SingerOfTheFall
你的意思是'std :: string trim(char const * str)'? – avakar
絕對可以在SO – billz