Переменная C ++ неожиданно перезаписана - PullRequest
0 голосов
/ 03 мая 2020

Я просто не понимаю. У меня есть две "основные переменные" address и parameters. address - это константный символ, а parameters - строка (массив символов), которая заполняется информацией.

Теперь очень странная вещь (по крайней мере для меня): после добавления метки времени к 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 Ответ

3 голосов
/ 03 мая 2020

Эта куча буферов, strcats и прочего более сложна, чем должна быть

Вместо этого вы можете сделать это:

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

В исходном коде вы переполняете tempDeviceStatus который имеет размер 1, но вы записываете в него два символа (0 или 1 плюс нулевой терминатор), а также переполняете tempValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...