我正在尝试使用outtext()函数在graphics.h控制台上打印包含字符串的集合的元素,但是我收到此错误:
无法将'std :: string {aka std :: basic_string}'转换为'char *'以将参数'1'转换为'void outtext(char *)'|
这是给出错误的代码:
for(i=0;i<20;i++){
for(j=0;j<20;j++){
outtext(str[i][j]);
}
}
graphics.h标题中outtext函数的模板如下:
void outtext(char *textstring);
我使用过c_str():
for(i=0;i<20;i++){
for(j=0;j<20;j++){
outtext(str[i][j].c_str());
}
}
但这一次它给出了这个错误:
错误:从'const char *'无效转换为'char *'[-fpermissive] |
答案 0 :(得分:1)
我认为这个问题是关于30年前的BGI图形库和Borland C ++。问题的根源在于这个库写得不好,因为它没有实现const正确性。
Turbo C ++编译器没有跟踪任何远离任何C ++标准的内容,所以你大部分都不走运。如果你有一个合适的C ++编译器,你可以使用const_cast
,但我非常怀疑你可以使用它。
唯一的解决方案是肮脏,糟糕的方式:
outtext((char*)str[i][j].c_str()); // bad practice
你不应该在C和C ++中抛弃这样的const
。
答案 1 :(得分:1)
你也可以尝试这个:
char *cstr = new char[21]; // just in case string length is maxed at 20, leave 1 character for '\0'
for (int i = 0; i<20; i++) {
for (int j = 0; j<20; j++) {
strcpy_s(cstr, str[i][j].length() + 1, str[i][j].c_str());
outtext(cstr);
}
}
delete[] cstr;
只需添加char*
字符串即可暂时保留已转换的std::string
值。棘手的部分是char*
字符串通常具有\0
没有的终止字符std::string
,因此您必须在{的每个“行”的大小上再添加1个字符。 {1}}。
答案 2 :(得分:0)
如果您可以更改输出函数的原型,那么最好将void outtext(char *textstring);
更改为void outtext(const char *textstring);
,因为输出函数不需要修改字符串。否则,您可以在传递给const_cast
之类的函数之前使用outtext(const_cast<char*>(str[i][j].c_str()))
,或者将字符串复制到另一个char*
并传递复制的值。