在Arduino IDE中,为什么函数的第二次调用会改变之前的调用结果?
问题描述:
我试图编写一个函数,它将一串十六进制值转换为Unicode UTF-8字符的字符串。当这个函数被调用一次时,一切都很好。但是当函数连续调用两次相同或不同的参数时,两个输出字符串都是没有意义的。在Arduino IDE中,为什么函数的第二次调用会改变之前的调用结果?
void HEX2String(String* HEXstr, String* str) {
String s2 = "", s3 = "";
long c, c1, c0;
char ch[2] = { 0 };
for (int i = 0; i <= HEXstr->length() - 4; i = i + 4) {
s2 = HEXstr->substring(i, i + 1) + "x" + HEXstr->substring(i + 1, i + 4);
c = (hex2long(&s2));
if (c < 255)
*str += String((char)c);
else {
c1 = (128 + (c & B111111));
c0 = (192 + (c >> 6));
ch[1] = c1;
ch[0] = c0;
str->concat(ch);
}
}
}
String str1 = "0628064700200646062706450020062E062F0627000A0633064406270645000A064806310648062F0020062806470020063306CC0633062A06450020062A064806330637";
String str = "0628064700200646062706450020062E062F0627000A0633064406270645000A064806310648062F0020062806470020063306CC0633062A06450020062A064806330637000A00730061006C0061006D0020006200610072002000730068006F006D0061";
String msg = "";
void setup() {
Serial.begin(9600);
//First call
HEX2String(&str, &msg);
Serial.println(msg);
msg = "";
//Second call
HEX2String(&str1, &msg);
Serial.println(msg);
}
void main() {
//
}
如果我评论了第二个电话,在串口监视器输出:
سلام
ورود به سیستم توسط
salam bar shoma
这是正确的。如果第二个呼叫未被注释,则串行监视器中的输出为:
ب⸮⸮ه⸮⸮ ن⸮⸮ا⸮⸮م⸮⸮ خ⸮⸮د⸮⸮ا⸮⸮
س⸮⸮ل⸮⸮ا⸮⸮م⸮⸮
و⸮⸮ر⸮⸮و⸮⸮د⸮⸮ ب⸮⸮ه⸮⸮ س⸮⸮ی⸮⸮س⸮⸮ت⸮⸮م⸮⸮ ت⸮⸮و⸮⸮س⸮⸮ط⸮⸮
salam bar shomaب⸮⸮ه⸮⸮ ن⸮⸮ا⸮⸮م⸮⸮ خ⸮⸮د⸮⸮ا⸮⸮
س⸮⸮ل⸮⸮ا⸮⸮م⸮⸮
و⸮⸮ر⸮⸮و⸮⸮د⸮⸮ ب⸮⸮ه⸮⸮ س⸮⸮ی⸮⸮س⸮⸮ت⸮⸮م⸮⸮ ت⸮⸮و⸮⸮س⸮⸮ط⸮⸮
答
C字符串需要以空字符终止。您的ch
不是。
把它定义为3个字符:
char ch[3] = { 0 };
,并添加一个空终止:
ch[0] = c0;
ch[1] = c1;
ch[2] = 0;
它看起来像@dda的称号修复了一些情况下,和语法错误。你似乎又把它们加回来了,所以我修好了它。请不要回复 - 志愿编辑的一些改进对您有利。 – halfer
[如果答案解决了您的问题,您应该接受它。](https://stackoverflow.com/help/someone-answers)不要添加“谢谢”作为答案或添加“*(已解决)* “的标题。 –