我想使用static_cast
在字符数组中使用erase()
和find()
等字符串函数,比如char str[50]
。例如,请考虑以下细分:
char str[]="abcdefghi";
char val[]="bc";
static_cast<string>(str).erase(static_cast<string>(str).find(val[0]),1);
请告诉我它是否正确,如果是,则str不会保留它应该具有的值,即"acdefghi"
。
答案 0 :(得分:2)
请告诉我它是否正确
它无效。
static_cast<string>(str)
将从std::string
创建一个临时str
,其内容将从str
复制。对它的任何修改都与原始变量str
无关。
您可以在std::string
上执行此操作,并在必要时将其转换回const char*
。
string new_str(str); // construct std::string
new_str.erase(new_str.find(val[0]), )); // modification on it
cout << new_str.c_str() << endl; // convert back to `const char*`
答案 1 :(得分:0)
如果你想像stl容器一样访问char *(raw c string),那么就发明了 std :: experimental :: string_view 。但它只提供对read / iterate / find操作的访问权限,而不是修改。还有一个悲伤的时刻 - 它延迟了C ++ 17标准(无论如何GCC-6.x已经拥有它)。请参阅 boost :: utility :: string_view 。如果你想拥有char *的修改权限,我会建议你使用你自己的包装器在字符串上进行长度检查等。
这是我正在谈论的一个例子:
#include <iostream>
#include <experimental/string_view>
#include "string.h"
using namespace std;
typedef experimental::string_view string_view;
class RawStringWrapper : public string_view
{
char * sstr;
size_t len;
public:
RawStringWrapper(char * str, size_t sz)
: std::experimental::string_view(str, sz),
sstr(str),
len(sz){}
bool erase(const string &s){
auto pos = find(s);
if (std::string::npos != pos){
sstr[pos] = 0;
strcat(sstr, sstr + pos + s.size());
return true;
}
return false;
}
// ...other modifying functions you need
};
int main(int argc, char *argv[])
{
char rawString[] = "abcdefgh";
RawStringWrapper str(rawString, sizeof(rawString));
str.erase("cde");
cout << rawString << endl;
return 0;
}