我正在使用pdCurses库,我的目标是仅在我的C ++控制台游戏中使用字符串,但是curses mvinstr()
函数或任何insert函数都需要非const char *
作为参数。
string.c_str()
,但会返回 const char *
,但显然无法使用该功能。(char *)string.c_str()
但这只会导致未处理的异常。char *test = string.c_str()
,但这也与const
不兼容。我该怎么做才能解决这个问题?
K我刚刚尝试了const_cast(),我仍然得到一个异常抛出并打破.... 我不知道为什么PDcurses只接受非const char指针.... =(
好吧,当我使用这段代码时,使用char *缓冲区不起作用(time_s是刺痛):
size_t length;
char buffer[12];
length=time_s.copy(buffer,5,0);
buffer[length]='\0';
mvinstr(time_loc_y, time_loc_x, buffer);
我甚至在mvinstr()之前停止并检查缓冲区的内容是“00/0” 我想要什么。
但是我得到了一个访问违规点“xutility”....
答案 0 :(得分:7)
mvinstr(x,y,str)
和其他人“从窗口中的当前位置或指定位置获取字符(或宽字符),并将其作为str
(或wstr
)中的字符串返回。”
该函数实际上会修改字符串,因此您无法安全地转换const
,尤其是因为c_str
指定您不应修改返回的字符串。
您需要以下内容:
const MAX = 100;
char buf[MAX];
mvinnstr(x, y, buf, MAX);
...error checking...
string s = buf;
请注意,我避免mvinstr
支持mvinnstr
以避免缓冲区溢出的可能性。
答案 1 :(得分:3)
怎么样
char* buffer = &str[0];
int fetched_len = mvinnstr(time_loc_y, time_loc_x, buffer, str.size());
str.resize(fetched_len);
但是,一般情况下,您应该创建一个可写缓冲区,而不是从具有它的指针中删除const
。 e.g。
vector<char> charvec(MAX_LENGTH);
str = string(&charvec[0], mvinnstr(time_loc_y, time_loc_x, &charvec[0], charvec.size());
答案 2 :(得分:2)
谨慎 - 如果使用was - const
数据的代码尝试修改它,则可能发生任何事情。
简而言之:
const std::string str = "...";
char *caution = const_cast<char *>(str.c_str());
但是,鉴于您正在处理未处理的异常,您可能需要在调用mvinstr()
之前制作常量字符串的可修改副本。也许:
const std::string str = "...";
char *caution = new char[str.length()+1];
str.copy(caution, str.length()+1);
...call to mvinstr()...
delete[] caution;
答案 3 :(得分:1)
由于mvinstr
实际上是将数据存储到char*
所指向的数组中,因此您无法使用string
。您需要分配一个char数组,将其传递给mvinstr
,然后根据需要将字符传输到string
。
如果您使用的函数可以使用const char *
声明(即它实际上没有修改数组),那么您可以使用const_cast<>
删除const
const_cast<char *>(str.c_str());
但那不是你在这里做的。 const_cast
如果你尝试过它可能会有效,但这可能是偶然的,不是因为它应该有效,而且新的编译器或库版本可以随时打破它。
答案 4 :(得分:1)
尝试以下内容,然后在需要buffer
的任何地方使用char*
。正如Ben所提到的,你需要非常小心地保持缓冲区大于字符串加上空终止符。
const int BUFFER_SIZE = 255;
string str ("Your string");
char buffer[BUFFER_SIZE];
if (str.length() < BUFFER_SIZE)
{
size_t copy_length;
copy_length=str.copy(buffer,str.length(),0);
buffer[copy_length]='\0';
}
答案 5 :(得分:0)
删除const可以使用const_cast
来完成,有时需要使用用C编写的旧版接口并且不使用const。在这种情况下,你可以这样做:
char* ptr = const_cast<char*> (str.c_str());
但是,从c_str()的cplusplus参考页面:
返回的数组指向一个内部位置,该位置具有此字符序列所需的存储空间加上其终止的空字符,但此数组中的值不应在程序中修改,只能保持不变,直到接下来调用字符串对象的非常量成员函数。
这意味着您有责任确保ptr
不用于修改字符串,并且必须处理{{1}的生命周期适当的。即,在ptr
超出范围之后,或者在ptr
上调用任何非const方法之后,您无法继续使用str
。如果你这样做,你将进入未定义的行为,并可能会崩溃。
如果您正在寻找一种安全的方式与str
的旧版界面进行交互,您可以制作自己的可写副本:
char*
答案 6 :(得分:-1)
if (string.empty()) foo(const_cast<char*>(string.c_str());
更好但仍然邪恶的方法来删除const是const_cast(const_string); (最好通过grep / search查找)
你遇到过巫婆异常吗? 你刚读过char *还是更改了值?如果你改变了,你应该重新设计你的代码。 const char* test = string.c_str();
不创建字符串的深层副本,只是指向string.data()的内部数据表示的指针。
=&GT; (一个建议)找到一本C ++书籍,你可以从中深入了解c ++。或类似于C ++。