我的Arduino上有一个小程序,我在其中使用了Wiring框架中的HashMap库。 无论如何,HashMap的键类型为char *,值类型为char *。 我从文件中读取了一些键和值,然后尝试将它们添加到地图中。我将它们读作字符串,然后使用.c_str()方法将它们转换为char *。 当我打印地图时,我得到了非常奇怪的值,我认为这可能是内存中的垃圾? 任何人都知道如何解决这个问题,以及为什么会这样?我在想它可能需要对.c_str()返回的内存中的临时值做一些事情,但我不确定。有帮助吗? 这是代码:( st只是一个字符串,我把它分成两个,其中:是)。
String msgC = st.substring(0, st.indexOf(":") - 1);
const char* messageCode = msgC.c_str();
String msg = st.substring(st.indexOf(":") + 1);
const char* message = msg.c_str();
hashMap[messageCode] = message;
当我将'message'和'messageCode'打印到控制台时,它们没问题。 打印hashmap时的输出:
重点:真正擦拭,高和低价值:B0 D8 0 BE A0 9B 86:刮水器正在擦拭,高和低 关键:价值:⸮目前正在擦拭,高速。
关键:价值:⸮
编辑: 当我使用hashMap键和值的String类型时,我会得到更奇怪的行为:
if (dataFile) {
String st;
while (dataFile.available() > 0) {
char s = char(dataFile.read());
if (s!='\n'){
st = st+s;
}
else{
String msgC = st.substring(0, st.indexOf(":") - 1);
String msg = st.substring(st.indexOf(":") + 1);
Serial.print(msgC + " " + msg);
hashMap[msgC] = msg;
st = "";
}
}
现在,前三对msgC和msg被读取并存储得很好。但其余部分在句子中间分裂或根本没有加载。 Serial.print的输出:
1D0 834 B0 D8 0 A0 A0 9B 8雨刮器关闭。
1D0 834 B0 D8 0 A8 A0 9B 8刮水器,单次擦拭。
1D0 834 B0 D8 0 A1 A0 9B 8刮水器打开,不擦拭。
(直到这里没关系)
奇怪的东西。当我在HashMap中使用char *时没有发生这种情况,并且我没有更改代码中的任何其他内容。为什么更改HashMap键和值的类型会影响从文件读取?
答案 0 :(得分:0)
您只将指针添加到数据到hashmap:
String msg = st.substring(st.indexOf(":") + 1);
const char* message = msg.c_str();
hashMap[messageCode] = message;
销毁msg
后,message
指向的内存即可免费使用,因此未定义行为。
您的哈希映射实际上应包含String
个值,而不是char*
。