2015-11-07 2 views
2

У меня есть программа, в которой я хочу вывести список строк в окно консоли.Преобразование строки в char *

Эти строки приходят из моего food.getFoodName() метод (который возвращает строку) как «стейк», «Бургер», «Колбаса» и т.д.

Я выводя эти строки, используя петлю. Прежде чем я смогу вывести эти строки, мне нужно преобразовать текущую строку в цикле в const char *, чтобы я мог использовать ее в методе Draw_String().

Это код касается в этом процессе:

void DisplayFood(std::vector<Food> foods) 
{ 



    for (int i = 0; i < foods.size(); i++) 
    { 
     const char * c = foods.at(i).getFoodName().c_str(); 

     Draw_String(10, i, c); 
    } 
} 

inline void Draw_String(int x, int y, const char *string) 
{ 
    // this function draws a string at the given x,y 

    COORD cursor_pos; // used to pass coords 
    // set printing position 
    cursor_pos.X = x; 
    cursor_pos.Y = y; 
    SetConsoleCursorPosition(hconsole, cursor_pos); 

    // print the string in current color 
    printf("%s", string); 

} // end Draw_String 

std::string Food::getFoodName() 
{ 
    return FoodName; 
} 

Мой вопрос, это преобразование не работает должным образом, и мой выход на экране в основном нечитаемые символы ASCII, как «|||| ||||||||||||||»

Я ноб на C++, делал это только 10 недель. Но проблема заключается либо в процессе преобразования (скорее всего), либо в методе printf.

Кто-нибудь знает, что я делаю неправильно? Буду признателен за любую помощь.

+0

Если вы закомментировать 'SetConsoleCursorPosition' вызов, вы все еще получаете высокую производительность ASCii? – Kenney

+0

Нерелевантно: 'c_str()' уже возвращает 'char const *'. Таким образом, вы можете напрямую, 'Draw_String (10, i, foods.at (i) .getFoodName(). C_str());' – 101010

+0

Я знаю, но это не работает @ 101010 – Andros

ответ

6
foods.at(i).getFoodName() 

возвращает временный объект, который заканчивается срок его службы после утверждения, в том числе данных, возвращаемыхstd::string::c_str. Таким образом, доступ к памяти, на которую указывает c, является неопределенным поведением.

Вместо этого, вы можете

  • продлить срок службы ВРЕМЕННОГО путем связывания его с const ссылки:

    const std::string& foodName = foods.at(i).getFoodName(); 
    
  • начиная с C++ 11, привязать его к ссылке RValue:

    std::string&& foodName = foods.at(i).getFoodName(); 
    
  • просто передайте временную функцию dir ectly:

    Draw_String(10, i, foods.at(i).getFoodName().c_str()); 
    
  • возвращают ссылку из Food::getFoodName .


Вы также можете посмотреть на this нить.


Примечания:

  • Почему вы не используетеstd::string? std::cout будет хорошо работать с ним.

  • не должен использоваться в обычных кодах C++.


По предложению @juanchopanza в комментариях к этому ответу

+2

Другим вариантом было бы заставить 'getFoodName()' возвращать ссылку 'const'. – juanchopanza

+0

О, я вижу. getfoodName возвращает копию. Хорошо подмечено. –

+0

Добавлен @juanchopanza. Благодарю. – Downvoter

Смежные вопросы