我有一个程序,我想将一个字符串列表输出到控制台窗口。
这些字符串来自我的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方法。
任何人都知道我做错了什么?我很感激任何帮助。
答案 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::string
? std::cout
可以正常使用。
std::printf
不应该在常用的C ++代码中使用。
1 正如@juanchopanza在对此答复的评论中提出的