Tom*_*Tom 1 c++ pointers remove-if
我有一种情况,我想从一个以NULL结尾的char*中有效地删除一个字符.我可以假设传入的字符串很大(即复制效率不高); 但我也可以假设我不需要取消分配未使用的内存.
我以为我可以std::remove_if用于此任务(用NULL-terminator替换返回的迭代器中的字符),并设置以下测试程序以确保我的语法正确:
#include <algorithm>
#include <iostream>
bool is_bad (const char &c) {
return c == 'a';
}
int main (int argc, char *argv[]) {
char * test1 = "123a45";
int len = 6;
std::cout << test1 << std::endl;
char * new_end = std::remove_if(&test1[0], &test1[len], is_bad);
*new_end = '\0';
std::cout << test1 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然而,这个程序编译,我正在Segmentation Fault某个地方remove_if- 这里的输出来自gdb:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400914 in std::remove_copy_if<char*, char*, bool (*)(char const&)> (__first=0x400c2c "45", __last=0x400c2e "", __result=0x400c2b "a45",
__pred=0x4007d8 <is_bad(char const&)>) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1218
1218 *__result = *__first;
Run Code Online (Sandbox Code Playgroud)
这与gcc 4.1.2RedHat 4.1.2-52有关.
我的理解是原始指针可以用作ForwardIterators,但也许不是?有什么建议?
程序在尝试修改字符串文字时具有未定义的行为:
char * test1 = "123a45";
Run Code Online (Sandbox Code Playgroud)
改成:
char test1[] = "123a45"; // 'test1' is a copy of the string literal.
char * new_end = std::remove_if(test1, test1 + sizeof(test1), is_bad);
Run Code Online (Sandbox Code Playgroud)