将字符串转换为字符*

时间:2015-11-07 18:25:38

标签: c++ string char

我有一个程序,我想将一个字符串列表输出到控制台窗口。

这些字符串来自我的food.getFoodName()方法(返回字符串),如" Steak"," Burger"," Sausage"等

我使用循环输出这些字符串。在我输出这些字符串之前,我需要将循环中的当前字符串转换为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符号,如&#34; |||||||||||||||| ||&#34;

我是c ++的菜鸟,只做了10周。但问题是转换过程(最有可能)或printf方法。

任何人都知道我做错了什么?我很感激任何帮助。

1 个答案:

答案 0 :(得分:6)

foods.at(i).getFoodName()

返回一个临时对象,该对象在语句后结束其生命周期,包括 std::string::c_str返回的数据。因此,访问c指向的内存是未定义的行为。

相反,你可以

  • 通过将临时生命周期绑定到const引用来延长临时生命周期:

    const std::string& foodName = foods.at(i).getFoodName();
    
  • 从C ++ 11开始,将其绑定到右值引用:

    std::string&& foodName = foods.at(i).getFoodName();
    
  • 直接将临时函数传递给函数:

    Draw_String(10, i, foods.at(i).getFoodName().c_str());
    
  • Food::getFoodName 1 返回引用。


您可能还要查看this主题。

注意:

  • 为什么不使用 std::stringstd::cout可以正常使用。

  • std::printf 不应该在常用的C ++代码中使用。

1 正如@juanchopanza在对此答复的评论中提出的