我正在寻找具有以下原型的 C++ 函数:
char *trim(char *string)
我希望此功能执行以下操作:
- 修剪所有非字母数字字符
- 如果遇到空格,就是修剪空格和附加字符
- 返回修剪后的字符数组
例子:
输入:*&^!@^ThisIsA#Test String;'{><,.
输出:ThisIsATest
一种选择是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
。trim
由于兼容性,它既简化了定义,std::begin
又std::end
为您管理内存。
不确定这是否是最好的方式,性能方面,但它对我来说是最合乎逻辑的方式。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