C Arduino几乎相同的功能,输出非常不同

C Arduino几乎相同的功能,输出非常不同,c,arduino,C,Arduino,我有3种不同的功能,可以使用Arduino和SIM900发送文本消息 第一个函数有两个参数,并将给定给它的字符数组发送到目标电话号码 void sendText(char msg[], char num[]) { Serial.print("[Text] Sending text to "); Serial.println(num); simController.print("AT+CMGF=1\r"); delay(100); simController.print("AT

我有3种不同的功能,可以使用Arduino和SIM900发送文本消息

第一个函数有两个参数,并将给定给它的字符数组发送到目标电话号码

void sendText(char msg[], char num[]) {
  Serial.print("[Text] Sending text to ");
  Serial.println(num);
  simController.print("AT+CMGF=1\r");
  delay(100);
  simController.print("AT + CMGS = \"");
  simController.print(num);
  simController.println("\"");
  delay(100);
  Serial.print("[Text] ");
  Serial.println(msg);
  simController.println(msg);
  delay(100);
  simController.println((char)26);
  delay(100); 
  simController.println();
  delay(5000);
}
最后两个函数几乎相同,只是它们的参数数量不同,结果完全不同

void sendText(char msg[], char num[], int startChar) {
  char *newMsg = (char *)malloc(strlen(msg)+1);
  memset(&newMsg[0], 0, sizeof(newMsg));
  Serial.print("[Text] Sending text to ");
  Serial.println(num);
  simController.print("AT+CMGF=1\r");
  delay(100);
  simController.print("AT + CMGS = \"");
  simController.print(num);
  simController.println("\"");
  delay(100);
  for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
  Serial.print("[Text] ");
  Serial.println(newMsg);
  simController.println(newMsg);
  delay(100);
  simController.println((char)26);
  delay(100); 
  simController.println();
  delay(5000);
}

void sendText(char msg[], char num[], int startChar, int endChar) {
  char *newMsg = (char *)malloc(strlen(msg)+1);
  memset(&newMsg[0], 0, sizeof(newMsg));
  Serial.print("[Text] Sending text to ");
  Serial.println(num);
  simController.print("AT+CMGF=1\r");
  delay(100);
  simController.print("AT + CMGS = \"");
  simController.print(num);
  simController.println("\"");
  delay(100);
  for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
  Serial.print("[Text] ");
  Serial.println(newMsg);
  simController.println(newMsg);
  delay(100);
  simController.println((char)26);
  delay(100); 
  simController.println();
  delay(5000);
}
输出如下所示

sendText("Hello","+447597865XXX");
sendText("Hello","+447597865XXX", 1);
sendText("Hello","+447597865XXX", 1, 3);
[Text] Sending text to +447597865XXX
[Text] Hello
[Text] Sending text to +447597865XXX
[Text] ello
[Text] Sending text to +447597865XXX
[Text] ell��U�����=ڨl��fr}Ѧ�o�e�6�������f��+��V���_{���

为什么会这样?请记住,
void-sendText(char-msg[],char-num[],int-startChar,int-endChar)
的正文与
void-sendText(char-msg[],char-num[],int-startChar)
memset
是错误的,特别是
sizeof(newMsg)
其中
newMsg
是指针。因此,
sizeof(newMsg)
很可能是2或4,这取决于您的平台。第一个可能很幸运,在未初始化的内存中已经有0

将传递给
malloc
的大小也用于
memset
(或者仅在使用
for
循环复制数据后写入字符串终止符
'\0'

并且还要检查
malloc
是否成功,即它的返回值不是
NULL

编辑:要重构第二个函数,可以删除对
memset
的调用并更改

for (int x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
for(int x=0;x
int x;
for (x=0;x<strlen(msg);x++) newMsg[x] = msg[x+startChar];
newMsg[x] = '\0'; // Or just 0, it is equivalent