简体   繁体   中英

printing a set containing strings on graphics.h in c++

I am trying to print the elements of a set containing strings on graphics.h console using outtext() function,but i get this error:

cannot convert 'std::string {aka std::basic_string}' to 'char*' for argument '1' to 'void outtext(char*)'|

this the piece of code that gives error:

for(i=0;i<20;i++){

    for(j=0;j<20;j++){

        outtext(str[i][j]);
    }
    
}

the template for the outtext function in the graphics.h header is like this:

void outtext(char *textstring);

i have used c_str() like this:

for(i=0;i<20;i++){

    for(j=0;j<20;j++){

        outtext(str[i][j].c_str());
    }
    
}

but this time it gives this error:

error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|

I take it this question is about the 30 years old BGI graphics library and Borland C++. The root of the problem is that this library was poorly written, as it didn't implement const correctness.

The Turbo C++ compiler did not follow anything remotely close to any C++ standard, so you are mostly out of luck. If you had a proper C++ compiler you could use const_cast , but I very much doubt this is available to you.

The only solution left is the dirty, bad way:

outtext((char*)str[i][j].c_str()); // bad practice

You should never cast away const like this in neither C nor C++.

You can try this one as well:

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;

Just added a char* string to temporarily hold the converted std::string value. The tricky part is that char* strings normally have the terminating character \0 which std::string don't have, so you have to add 1 more character to the size of each "row" of str .

If you can change the prototype of the output function then it is better to change void outtext(char *textstring); to void outtext(const char *textstring); because there is no need for the output function to modifiy the string. Otherwise you could use const_cast before passing to the function like outtext(const_cast<char*>(str[i][j].c_str())) or copy the string to another char* and passed the copied value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM