【问题标题】:map c++ with const char* keys retrieves null [duplicate]使用 const char* 键映射 c++ 检索 null [重复]
【发布时间】:2020-06-12 01:25:49
【问题描述】:

所以,我正在尝试在 C++ 中学习 map。我将类型为std:: map <const char *, int> 放入变量month

说,数据是month["Jul"] = 7;

当我尝试直接检索值时

printf("%d", month["Jul"]);

成功并输出值。

7

尝试使用另一个变量也成功。

const char *p = "Jul";
printf("%d", month[p]); // 7

但是当我尝试用给定的输入分配它时会发生奇怪的行为。

const char in_month[3];
scanf("%s", in_month);
print("%d". month[in_month]);

它检索(null)

0

我做了这里禁止的事情还是我错过了一个步骤?

【问题讨论】:

  • 您是否尝试过使用 C++ 成语代替 C 成语?
  • @Eljay 如果你指的是std:: cinstd:: cout,我已经完成了,结果是一样的。
  • std::string, std::cin, std::cout,不使用printf,不使用const char*,不使用scanfminimal reproducible example 也很有用。

标签: c++ dictionary


【解决方案1】:

当你使用const char*作为key时,std::map会直接比较指针,而不是指针指向的内容。对于c-style string literals,相同的字符串文字可能会被比较为相等,但这不能保证。

允许但不要求编译器组合存储相等或重叠的字符串文字。这意味着相同的字符串文字在通过指针比较时可能比较相等,也可能不相等。

当你使用数组in_month时,转换成指针后指向不同的东西,那么指针比较的结果就是false

最好使用std::string 而不是std:: map <std::string, int>std::string 具有明确定义的 comparison operator,它根据字符串的内容进行比较。

【讨论】:

  • 我同意你的看法。我遇到了一些带有给定输入字符的奇怪输出。在我的代码变成意大利面条之前,我会使用 std:: string 来接受您的建议。
  • @NabilAsykar 奇怪的输出?它可能来自数组 in_month 的声明,它包含 3 个元素并且不能遍历字符串文字 "Jul",它有 4 个 chars,包括空终止符 '\0'
  • 是的不起作用我在线设置了一个测试它失败了。 onlinegdb.com/r1tcJ_xaU
猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多