在 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.