我就是不明白。我有两个“主要变量” address
和parameters
。
address
是一个const char,parameters
是一个字符串(char数组),其中充满了信息。
现在这很奇怪(至少对我而言):在parameters
中添加时间戳后,address
被清除!
有人知道为什么吗?
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
void setOnlineStatus(char deviceName[30], bool deviceStatus, const char outputContent[50], int value, const char functionName[30], bool onlineRequestImmediately=true) {
const char address[128]= "https://api.arduino.myAddress.com";
char parameters[512] = "?secret=w2q3oifin23c&deviceName=";
cout << "Address: ";
cout << address << endl;
cout << "Parameters: ";
cout << parameters << endl;
strcat(parameters, deviceName);// +"&status="+deviceStatus+"&value="+value+"&time="+getTimestamp()+"&functionName="+functionName;
strcat(parameters, "&status=");
char tempDeviceStatus[1];
sprintf(tempDeviceStatus, "%d", deviceStatus);
strcat(parameters, tempDeviceStatus);
cout << "Address01: ";
cout << address << endl;
strcat(parameters, "&value=");
char tempValue[3];
sprintf(tempValue, "%d", (int) value);
strcat(parameters, tempValue);
cout << "Address02: ";
cout << address << endl;
strcat(parameters, "&functionName=");
strcat(parameters, functionName);
cout << "Address03: ";
cout << address << endl;
strcat(parameters, "&time=");
char tempTimestamp[10];
sprintf(tempTimestamp, "%d", 1234567890);
strcat(parameters, tempTimestamp); // this doesn't work neither: strcat(parameters, "1234567890");
cout << "Address04: ";
cout << address << endl; // output is empty!
strcat(parameters, "&message=");
strcat(parameters, outputContent);
cout << "Address05: ";
cout << address << endl; // output is empty!
cout << "Parameters: ";
cout << parameters << endl;
}
int main()
{
setOnlineStatus("testControl1", 1, "controlTurnedOff", 201, "toggleFans()");
}
这是输出:
Address: https://api.arduino.myAddress.com
Parameters: ?secret=w2q3oifin23c&deviceName=
Address01: https://api.arduino.myAddress.com
Address02: https://api.arduino.myAddress.com
Address03: https://api.arduino.myAddress.com
Address04:
Address05:
Parameters: ?secret=w2q3oifin23c&deviceName=testControl1&status=1&value=201&functionName=toggleFans()&time=1234567890&message=controlTurnedOff
答案 0 :(得分:3)
这堆缓冲区,strcat和其他东西比需要的复杂得多
相反,您可以执行以下操作:
char parameters[512];
int result = snprintf(parameters, sizeof parameters,
"?secret=w2q3oifin23c"
"&deviceName=%s"
"&status=%d"
"&value=%d"
"&functionName=%s"
"&time=%d"
"&message=%s",
deviceName, (int)deviceStatus, value, functionName, 1234567890, outputContent);
if ( result < 0 || result >= sizeof parameters )
// ...handle error or overflow
在原始代码中,您溢出了大小为1的tempDeviceStatus
,但您向其中写入了两个字符(0或1加上一个空终止符),并且还溢出了tempValue