在c ++中打印包含graphics.h字符串的集合

时间:2016-04-15 06:19:39

标签: c++ string graphics

我正在尝试使用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] |

3 个答案:

答案 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*并传递复制的值。