C ++变量意外被覆盖

时间:2020-05-03 13:37:01

标签: c++ arduino

我就是不明白。我有两个“主要变量” addressparametersaddress是一个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

1 个答案:

答案 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

相关问题