如何将`const char *`转换为`char *`?

时间:2011-05-16 23:27:28

标签: c++ constants const

我正在使用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”....

7 个答案:

答案 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 ++。