我知道我可以str.c_str()
执行此操作,
但我不希望角色不变。我想要一个字符,以便我可以做一些修改。
char* removeDup(char *s)
{
int len = strlen(s);
int p,q, idx = -1;
for(p = 0; p< len; p++)
{
char temp = s[p];
bool flag = true;
for(q=0;q<p;q++)
{
if(s[q] == temp)
{
flag = false;
break;
}
}
if(flag == true)
{
s[++idx] = temp;
}
}
s[++idx] = '\0';
return s;
}
如果我将此函数调用如下,我会收到错误;
string s = "abcde";
removeDuplicate(s.c_str());
我需要将此s
转换为char
而不是const char
。
答案 0 :(得分:5)
从std::string
获取基础数据您可以使用:
string::data() 或 string::c_str() ,均返回const char *
。
在任何一种情况下,返回的数据都是const char *
,因为它的内存是在一些只允许用户程序修改的只读实现定义区域中分配的。任何修改返回的const char *
的尝试都会导致未定义的行为。
所以你不能也不应该(通过const_cast
)修改返回的字符串。
通过创建新的char*
,分配它并复制const char*
中的内容来实现此目的的唯一正确方法:
std::string myString = "blabla";
char* myPtr = new char[myString.size() + 1];
myString.copy(myPtr, myString.size());
myPtr[myString.size()] = '\0';
答案 1 :(得分:2)
我建议制作一个缓冲区的副本,调用你的函数,然后将原始字符串设置为新的char缓冲区。类似的东西:
std::string str("some string");
char tmp[str.length() + 1];
memset(tmp, 0, sizeof(tmp));
copy(str.begin(), str.end(), tmp);
str = removeDup(tmp);
直接使用c_str()返回的const缓冲区并修改它会导致问题。缓冲区由字符串对象拥有,您应该考虑将其修改为破坏封装并且至少取决于实现。
答案 2 :(得分:1)
只需复制即可。
string str = "Hello";
char * cStr = new char[str.size()];
memcpy(cStr, str.c_str(), str.size());
答案 3 :(得分:1)
合法修改std::string
的唯一方法是通过
它是成员函数(包括间接访问路径)
提供)。因此,您应该重写您的removeDup
std::string::iterator
作为参数,例如:
std::string
removeDup( std::string& original )
{
std::string::iterator current = original.begin();
std::string::iterator end = original.end();
while ( current != end ) {
end = std::remove( current + 1, end, *current );
++ current;
}
original.erase( end, original.end() );
return original;
}
(我认为这会影响您的原始代码。我无法确定, 因为我无法弄清楚你的原始代码。)
从设计的角度来看,这很难看;你应该通过一个
std::string const&
,并返回新的std::string
:
std::string
removeDup( std::string const& original )
{
std::string results;
std::bitset<UCHAR_MAX + 1> alreadySeen;
for ( std::string::const_iterator current = original.begin();
current != original.end();
++ current ) {
if (! alreadySeen.test( static_cast<unsigned char>( *current ) ) ) {
results += *current;
alreadySeen.set( static_cast<unsigned char>( *current ));
}
}
return results;
}
您希望从char*
获得std::string
的唯一时间是通过
它是遗留代码(或C)。在这种情况下,std::string::c_str()
就是
批准的方法;如果您正在呼叫的功能需要char*
,
然后:
如果函数实际上没有修改字符串(它不是const
正确,但这是许多C函数的情况),然后使用
const_cast
的返回值为std::string::c_str()
,否则为
您必须分配一个本地缓冲区并传递它:
std :: vector localBuffer(s.begin(),s.end()); localBuffer.push_back('\ 0'); legacyFunction(&amp; localBuffer [0],localBuffer.size());
答案 4 :(得分:0)
我认为你想要这个方法来自字符串:
复制字符串中的字符序列: http://www.cplusplus.com/reference/string/string/copy/
例如。如果你有一个字符串'str',你可以这样做:
char buf[str.len()+1]
str.copy(buf, str.len())
//terminate with newline
buf[str.len() = '\n']
希望有所帮助。
答案 5 :(得分:0)
在'可能'领域而不是'明智'你可以做到:
std::string str("foo");
str = removeDup( std::auto_ptr<char>(strdup(str.c_str()).get() );
但是用std :: string重写会更好。