【问题标题】:Access from map, casting string to char*从地图访问,将字符串转换为 char*
【发布时间】:2012-12-27 21:59:40
【问题描述】:

我在转换(或访问数据,我不确定)时遇到以下问题:

map<int, string> keys我用来描述按钮,数字与Allegro5键码匹配(例如keys[81] = "PgDown")。我想使用al_draw_text在屏幕上打印数据,需要传递char*参数。

我试过用这种方式访问​​数据:

char dropdownBuffer[16];
cout << keys[dropdownKeyCode] << endl;
sprintf_s(dropdownBuffer, "%s", keys[dropdownKeyCode]);
cout << dropdownBuffer << endl;
gui.drawButton(CLIENT_PADDING, CLIENT_PADDING+50+219, 123, 38, dropdownBuffer);

控制台应该打印字符串Spacja 两次,但第二次有一些随机字符。

我现在做错了什么?也许还有其他可能的方法可以将此字符串转换为字符?

【问题讨论】:

  • 使用c_str() 获得const char *。假装 std::stringchar * 是个坏主意。
  • 它给了我另一个错误:错误 C2664: 'GUI::drawButton' : cannot convert parameter 5 from 'const char *' to 'char *'。
  • 然后复制它。 sprintf 应该没问题。
  • 永远,永远,永远通过 ... 传递 C++ 对象!一次也没有。

标签: c++ map casting


【解决方案1】:

要从字符串中获取指向数据的指针,请使用 c_str(),请参阅参考:this

替换代码:

sprintf_s(dropdownBuffer, "%s", keys[dropdownKeyCode]);

与:

sprintf_s(dropdownBuffer, "%s", keys[dropdownKeyCode].c_str());

【讨论】:

  • 这不对。 c_str() 返回 const char* 而不是 char *
  • @Rapptz,他从字符串复制, const char* 应该没问题?
  • @billz,我认为 Rapptz 的意思是你的第一句话。
【解决方案2】:

我认为 sprintf_s 需要一个 sizeof 参数。

sprintf_s(dropdownBuffer, sizeof(dropdownBuffer), "%s", keys[dropdownKeyCode]);

const char* dropdownBuffer = keys[dropdownKeyCode].c_str();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2013-05-13
    • 1970-01-01
    • 2020-09-30
    • 2014-05-16
    • 2012-01-16
    • 2013-02-15
    相关资源
    最近更新 更多