在 C++ 中打印包含 graphics.h 上的字符串的集合
printing a set containing strings on graphics.h in c++
我正在尝试使用 outtext() 函数在 graphics.h 控制台上打印包含字符串的集合的元素,但出现此错误:
无法将参数“1”的 'std::string {aka std::basic_string}' 转换为 'char*' 到 'void outtext(char*)'|
这是一段出错的代码:
for(i=0;i<20;i++){
for(j=0;j<20;j++){
outtext(str[i][j]);
}
}
graphics.hheader中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]|
如果可以更改输出函数的原型那么最好将void outtext(char *textstring);
更改为void outtext(const char *textstring);
,因为输出函数不需要修改字符串。否则,您可以在传递给 outtext(const_cast<char*>(str[i][j].c_str()))
之类的函数之前使用 const_cast
或将字符串复制到另一个 char*
并传递复制的值。
我认为这个问题是关于已有 30 年历史的 BGI 图形库和 Borland C++。问题的根源是这个库写得不好,因为它没有实现 const 的正确性。
Turbo C++ 编译器没有遵循任何与任何 C++ 标准相差甚远的东西,所以你很不幸。如果你有合适的 C++ 编译器,你可以使用 const_cast
,但我非常怀疑你是否可以使用它。
唯一剩下的解决方案是肮脏、糟糕的方法:
outtext((char*)str[i][j].c_str()); // bad practice
无论是在 C 还是 C++ 中,你都不应该像这样丢弃 const
。
你也可以试试这个:
char *cstr = new char[21]; // just in case string length is maxed at 20, leave 1 character for '[=10=]'
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*
字符串通常具有终止字符 [=14=]
而 std::string
没有,因此您必须在每个 "row" 的大小上再添加 1 个字符共 str
.
我正在尝试使用 outtext() 函数在 graphics.h 控制台上打印包含字符串的集合的元素,但出现此错误:
无法将参数“1”的 'std::string {aka std::basic_string}' 转换为 'char*' 到 'void outtext(char*)'|
这是一段出错的代码:
for(i=0;i<20;i++){
for(j=0;j<20;j++){
outtext(str[i][j]);
}
}
graphics.hheader中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]|
如果可以更改输出函数的原型那么最好将void outtext(char *textstring);
更改为void outtext(const char *textstring);
,因为输出函数不需要修改字符串。否则,您可以在传递给 outtext(const_cast<char*>(str[i][j].c_str()))
之类的函数之前使用 const_cast
或将字符串复制到另一个 char*
并传递复制的值。
我认为这个问题是关于已有 30 年历史的 BGI 图形库和 Borland C++。问题的根源是这个库写得不好,因为它没有实现 const 的正确性。
Turbo C++ 编译器没有遵循任何与任何 C++ 标准相差甚远的东西,所以你很不幸。如果你有合适的 C++ 编译器,你可以使用 const_cast
,但我非常怀疑你是否可以使用它。
唯一剩下的解决方案是肮脏、糟糕的方法:
outtext((char*)str[i][j].c_str()); // bad practice
无论是在 C 还是 C++ 中,你都不应该像这样丢弃 const
。
你也可以试试这个:
char *cstr = new char[21]; // just in case string length is maxed at 20, leave 1 character for '[=10=]'
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*
字符串通常具有终止字符 [=14=]
而 std::string
没有,因此您必须在每个 "row" 的大小上再添加 1 个字符共 str
.