Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数如何返回比它正在填充的字符数组大的cstring? 我想开始解释这只是一个好奇的问题来帮助我更好地理解C++。 我正在使用C++中的cStords/Cux>库来从多个变量生成一个长cStand。我正在运行一个测试程序,以查看保存cstring所需的最大字符数组。为此,我将buffer定义为一个全局变量,其大小我知道将保存cstring。生成后,我使用strlen查找最大长度,结果是1517。然后出于好奇,当它失败时会是什么样子,我将缓冲区的大小减少到1000。。。它仍然有效。直到我将buffer减少到300,我才得到执行错误_C++_Arrays_C Strings - Fatal编程技术网

函数如何返回比它正在填充的字符数组大的cstring? 我想开始解释这只是一个好奇的问题来帮助我更好地理解C++。 我正在使用C++中的cStords/Cux>库来从多个变量生成一个长cStand。我正在运行一个测试程序,以查看保存cstring所需的最大字符数组。为此,我将buffer定义为一个全局变量,其大小我知道将保存cstring。生成后,我使用strlen查找最大长度,结果是1517。然后出于好奇,当它失败时会是什么样子,我将缓冲区的大小减少到1000。。。它仍然有效。直到我将buffer减少到300,我才得到执行错误

函数如何返回比它正在填充的字符数组大的cstring? 我想开始解释这只是一个好奇的问题来帮助我更好地理解C++。 我正在使用C++中的cStords/Cux>库来从多个变量生成一个长cStand。我正在运行一个测试程序,以查看保存cstring所需的最大字符数组。为此,我将buffer定义为一个全局变量,其大小我知道将保存cstring。生成后,我使用strlen查找最大长度,结果是1517。然后出于好奇,当它失败时会是什么样子,我将缓冲区的大小减少到1000。。。它仍然有效。直到我将buffer减少到300,我才得到执行错误,c++,arrays,c-strings,C++,Arrays,C Strings,当我在main()函数中定义buffer时,当buffer小于输出时,我会得到错误,但它仍然打印完整的输出。在我的工作示例中,我使用了gbuffer和buffer作为全局版本的buffer和本地版本的buffer 我的假设是,cstring被写入内存,strcat在定义缓冲区或gbuffer时继续写入超过设置的边界,std::cout只是读取,直到它到达空字符,所以只要没有任何其他内容保留该空间或写入,程序仍然工作,虽然不能保证它会,因为它写在内存中而不是为它保留的 #include <i

当我在
main()
函数中定义buffer时,当
buffer
小于输出时,我会得到错误,但它仍然打印完整的输出。在我的工作示例中,我使用了
gbuffer
buffer
作为全局版本的buffer和本地版本的buffer

我的假设是,cstring被写入内存,
strcat
在定义缓冲区或gbuffer时继续写入超过设置的边界,
std::cout
只是读取,直到它到达空字符,所以只要没有任何其他内容保留该空间或写入,程序仍然工作,虽然不能保证它会,因为它写在内存中而不是为它保留的

#include <iostream>
#include <cstring>

//Global Variables
int Temperature=100;
int Heat=100;
int Cool=100;
char Status[100]="Nothing";
char Source[100]="Default";
char gbuffer[900];

struct schedulePoint {
  uint8_t days = 12;
  uint8_t heat = 65;
  uint8_t cool = 85;
  uint16_t start = 60*24;
  uint16_t end = 60*24;
};

struct myData {
  char myName[12] = "TestStat";
  schedulePoint schedule[64];
  char password[25];
  char ssid[25] = "Wifi Thermostat";
  bool hidden = false;
  uint8_t defaultHeat = 65;
  uint8_t defaultCool = 85;
  int timezone = 0;
  char serverUName[25] = "";
  char serverPW[25] = "";
} data;


char * get_JSON(char * buff, unsigned int buffSize) {
  std::cout << "Buffer Size:" << buffSize << "\n";
  char convert[500];
  strcpy(convert,"<script>schedule=[");
  strcpy(buff,convert);
  for (uint8_t z = 0; z < 64; z++) {
    if (z == 0) strcat(buff, "[");
    else strcat(buff, ",[");
    sprintf(convert, "%d,%d,%d,%d,%d]", data.schedule[z].days, data.schedule[z].heat, data.schedule[z].cool, data.schedule[z].start, data.schedule[z].end);
    strcat(buff, convert);
  }
  strcat(buff, "];\n");
  sprintf(convert, "SSID=\"%s\";\n",data.ssid);
  strcat(buff, convert);;
  strcat(buff, "states=[\"Off\",\"Heating\",\"Cooling\"];\n");
  sprintf(convert, "stats={\"Temperature\":%d,\"State\":%s,\"Heat\":%d,\"Cool\":%d,\"Source\":\"%s\"};\n</script>", Temperature, Status, Heat, Cool, Source);
  strcat(buff, convert);
  return buff;
}


int main(){
        char buffer[1000];
        std::cout << get_JSON(gbuffer,sizeof(gbuffer));
        std::cout << "\n";
        std::cout << "Ouput Size:" << (unsigned)strlen(gbuffer);
        std::cout << "\n";
        return 0;
}
#包括
#包括
//全局变量
内部温度=100;
int热=100;
int Cool=100;
字符状态[100]=“无”;
字符源[100]=“默认值”;
char-gbuffer[900];
结构调度点{
uint8天=12天;
uint8_t热=65;
uint8_t cool=85;
uint16_t start=60*24;
uint16_t end=60*24;
};
结构myData{
char myName[12]=“TestStat”;
schedulePoint时间表[64];
字符密码[25];
char ssid[25]=“Wifi恒温器”;
布尔隐藏=假;
uint8_t defaultHeat=65;
uint8_t defaultCool=85;
国际时区=0;
char serverUName[25]=“”;
char serverPW[25]=“”;
}数据;
char*get_JSON(char*buff,unsigned int buffSize){
标准::cout
我的假设是,cstring被写入内存,strcat在定义buffer或gbuffer时继续写入超过设置的边界,std::cout只是读取,直到它到达空字符,因此只要没有其他内容保留该空间或写入该空间,程序仍然可以运行,尽管无法保证它会运行,因为它是空的在内存中书写而不是为它保留

#include <iostream>
#include <cstring>

//Global Variables
int Temperature=100;
int Heat=100;
int Cool=100;
char Status[100]="Nothing";
char Source[100]="Default";
char gbuffer[900];

struct schedulePoint {
  uint8_t days = 12;
  uint8_t heat = 65;
  uint8_t cool = 85;
  uint16_t start = 60*24;
  uint16_t end = 60*24;
};

struct myData {
  char myName[12] = "TestStat";
  schedulePoint schedule[64];
  char password[25];
  char ssid[25] = "Wifi Thermostat";
  bool hidden = false;
  uint8_t defaultHeat = 65;
  uint8_t defaultCool = 85;
  int timezone = 0;
  char serverUName[25] = "";
  char serverPW[25] = "";
} data;


char * get_JSON(char * buff, unsigned int buffSize) {
  std::cout << "Buffer Size:" << buffSize << "\n";
  char convert[500];
  strcpy(convert,"<script>schedule=[");
  strcpy(buff,convert);
  for (uint8_t z = 0; z < 64; z++) {
    if (z == 0) strcat(buff, "[");
    else strcat(buff, ",[");
    sprintf(convert, "%d,%d,%d,%d,%d]", data.schedule[z].days, data.schedule[z].heat, data.schedule[z].cool, data.schedule[z].start, data.schedule[z].end);
    strcat(buff, convert);
  }
  strcat(buff, "];\n");
  sprintf(convert, "SSID=\"%s\";\n",data.ssid);
  strcat(buff, convert);;
  strcat(buff, "states=[\"Off\",\"Heating\",\"Cooling\"];\n");
  sprintf(convert, "stats={\"Temperature\":%d,\"State\":%s,\"Heat\":%d,\"Cool\":%d,\"Source\":\"%s\"};\n</script>", Temperature, Status, Heat, Cool, Source);
  strcat(buff, convert);
  return buff;
}


int main(){
        char buffer[1000];
        std::cout << get_JSON(gbuffer,sizeof(gbuffer));
        std::cout << "\n";
        std::cout << "Ouput Size:" << (unsigned)strlen(gbuffer);
        std::cout << "\n";
        return 0;
}

程序的行为未定义


不要这样做。

C++就像没有车道缓冲器的保龄球。没有什么能阻止你在数组边界之外写东西。最糟糕的是,程序可能仍然可以工作。但最终,未定义的行为是未定义的。