C++ 用于连接字符数组的函数,包括附加的中间登录

C++ 用于连接字符数组的函数,包括附加的中间登录,c++,arrays,arduino,C++,Arrays,Arduino,我已经试着解决了半天了。。。没有成功 我有一个结构: typedef struct s_iomodus { const char* SENSOR; const char* POSITION_1; const char* SHOW_MI; const char* POSITION_2; const char* TYPE_1; const char* TYPE_2; const char* DESCRIPTION; // LOC Description of the const int NRVA

我已经试着解决了半天了。。。没有成功

我有一个结构:

typedef struct s_iomodus {
const char* SENSOR; 
const char* POSITION_1;
const char* SHOW_MI;
const char* POSITION_2;
const char* TYPE_1;
const char* TYPE_2;
const char* DESCRIPTION;  // LOC Description of the
const int NRVALUES;
} iomodus_t;

iomodus_t iomodus[] = {
{ "Relay","WW_Tank","WW_Pumpe_An_Aus","NO_P2","NO_T1","NO_T2" ,"MAGNETIC", 1}, //D25 :
{ "Relay","Puffer_Tank","NO_SHOW","NO_P2","NO_T1","NO_T2" ,"SSR", 1}, //D26 :
{ "Relay","WW_Tank","Valve","Auslauf_unten","Zu","Auf" ,"MAGNETIC", 2}, //D27 :
在这里,我存储所有管脚和位置的所有现状设置,并将其作为主题发送到MQTT服务器

现在,我必须从这个数组中构建一个字符串,以便在VOID设置中将其作为

void setup()
{
  Serial.begin(115200);

  MQTTclient.setServer(server, 1883);
  MQTTclient.setCallback(callback);
  Ethernet.begin(mac, ip);
  // Allow the hardware to sort itself out
  delay(1500);

 const char *c_topic = concat_strings(iomodus[i].POSITION_1,iomodus[i].SENSOR, iomodus[i].POSITION_2);

      Serial.println(c_topic);
      MQTTclient.publish(c_topic, iomodus[i].VERSION);

    }
我的问题是。。。函数没有生成正确的字符串 它不会在两者之间添加“/” 它应该是如下所示的字符串: “MQTTTOPIC_前缀/TEXT_str1/TEXT_str2/TEXT_str3” 或 “MQTTTOPIC_PREFIX/TEXT_str1/TEXT_str2/TEXT_str3/TEXT_str4”如果str4存在/不为空

const char *concat_strings(const char *str1, const char *str2, const char *str3,const char *str4)
{
  // define a buffer
  static char result[MAX_CONCAT_LEN] = {0};

  // counter part
  int i = 0;
  const char *slash = {"/"};
  const char *PREF= {MQTTTOPIC_PREFIX};
  size_t len = strlen(PREF)+strlen(str1)+strlen(str2)+strlen(str3);

  // loop until end of ID has reached or destination buffer is full
  while(*PREF && i < MAX_CONCAT_LEN)
    {result[i++] = *PREF++;}
  // loop until end of string 1 has reached or destination buffer is full
  while(*str1 && i < MAX_CONCAT_LEN)
    {result[i++] = *str1++;}
  // loop until end of string 2 has reached or destination buffer is full
  while(*str2 && i < MAX_CONCAT_LEN)
    {result[i++] = *str2++;}

if (str3==TRUE){
// loop until end of SLASH has reached or destination buffer is full
  while(*slash && i < MAX_CONCAT_LEN)
    {result[i++] = *slash++;} 
  while(*str3 && i < MAX_CONCAT_LEN)
   { result[i++] = *str3++;}
   }    

 if (str4==TRUE){
// loop until end of SLASH has reached or destination buffer is full
  while(*slash && i < MAX_CONCAT_LEN)
    {result[i++] = *slash++;} 
  while(*str4 && i < MAX_CONCAT_LEN)
   { result[i++] = *str4++;}
   }      

  result[len+1] = 0;

  return result;
}
const char*concat_字符串(const char*str1、const char*str2、const char*str3、const char*str4)
{
//定义缓冲区
静态字符结果[MAX_CONCAT_LEN]={0};
//对头
int i=0;
常量字符*斜杠={”/“};
const char*PREF={MQTTTOPIC_PREFIX};
尺寸长度=strlen(PREF)+strlen(str1)+strlen(str2)+strlen(str3);
//循环,直到到达ID的末尾或目标缓冲区已满
while(*PREF&&i
所以即使我这样做。。。如果str3或str4为FALSE,则不添加“/”且不希望识别

请问,如果str3或str4可用(str1和str2始终存在),加入阵列并添加“/”的最简单方法是什么


提前谢谢你

代码中有几个问题:

  • 首先,最好在函数外部声明
    result

    static char result[MAX_CONCAT_LEN] = {0};
    
  • 使用str4的默认值声明函数:

    const char *concat_strings(const char *str1, const char *str2, const char *str3,const char *str4 = NULL);
    
  • 不要将
    char*
    TRUE
    进行比较,而是使用
    NULL

    if (str4 != NULL){
    
  • PREF
    str1
    str2
    之间,没有代码添加分隔符:

    while(*PREF && i < MAX_CONCAT_LEN)
      {result[i++] = *PREF++;}
    // loop until end of string 1 has reached or destination buffer is full
    while(*str1 && i < MAX_CONCAT_LEN)
      {result[i++] = *str1++;}
    // loop until end of string 2 has reached or destination buffer is full
    while(*str2 && i < MAX_CONCAT_LEN)
      {result[i++] = *str2++;}
    
    在上一个循环中。(这里通常不需要循环,除非分隔符将来可能不止一个字符)

  • str4
    存在时,不调整
    len

    size_t len = strlen(PREF)+strlen(str1)+strlen(str2)+strlen(str3);
    
    result[len+1] = 0;
    
    不管怎样,它都会切断str4

如果可能,最好使用或

有关使用Arduino
string
类进行字符串连接的一些示例,请参阅和


我想您一定是下定决心要坚持使用C功能和
constchar*
strings。还有两个更有用的C字符串函数,如
strlen
strcopy
。正如您在C API中所注意到的,在处理原始
char*
字符串时,标准做法是发出一个缓冲区,函数应将其结果写入其中,因此很清楚清理字符串的责任是谁(在这种情况下:调用方的!)。因此,您可以执行以下操作(已测试):

//示例程序
#包括
#包括
#包括
bool strconcat(char*result,unsigned int bufsize,const char*s1,const char*s2,const char*s3,const char*s4){
常量字符*字符串[4]={s1,s2,s3,s4};
for(无符号字符i=0;i<4;++i){
常量char*s=字符串[i];
如果(!s)
返回true;
无符号整数len=strlen(s);
如果(len>bufsize)
返回false;
strcpy(结果,s);
bufsize-=len*sizeof(char);
结果+=len*sizeof(char);
if(i<3&&strings[i+1]){
如果(bufsize>0){
结果[0]='/';
--bufsize;
++结果;
}
其他的
返回false;
}
}
返回true;
}
int main()
{
字符结果[80]={0};
常量字符*a=“ab”;
const char*b=“xyziuehfih”;
const char*c=“IHFEIH”;
strconcat(结果,80,a,a,b,0);

如果你可以使用<代码> STD::String ,你能用它们吗?@ Nahanover我很想给他们一个相同的建议。我觉得不同的是,它们并不是真正的标准C++。@马克斯为什么不简单地使用?@πῥεῖ: 我试过了,但没用……这是我过去几乎是手动操作的最后一个版本;-)在你之后它会是什么样子?我知道arduino有一些字符串的适当实现。很好。@Danny\u ds:对不起……还没有使用字符串库……你的建议会是什么样子?提前谢谢你!@Max-有什么我的建议吗ike:
String-stringOne=String(stringTwo+“含更多”);//连接两个字符串
-请参阅一些示例或教程。感谢像charm一样工作……他已经重写了我的代码……我将在以后处理整个代码时给出反馈……谢谢!
size_t len = strlen(PREF)+strlen(str1)+strlen(str2)+strlen(str3);

result[len+1] = 0;
 // adding a constant integer to a string:
  stringThree = stringOne + 123;

  // adding a constant long interger to a string:
  stringThree = stringOne + 123456789;

  // adding a constant character to a string:
  stringThree = stringOne + 'A';

  // adding a constant string to a string:
  stringThree = stringOne +  "abc";

  // adding two Strings together:
  stringThree = stringOne + stringTwo;
// Example program
#include <iostream>
#include <string>
#include <cstring>

bool strconcat(char* result, unsigned int bufsize, const char* s1, const char* s2, const char* s3, const char* s4) {
    const char* strings[4] = {s1, s2, s3, s4};
    for(unsigned char i = 0; i < 4; ++i) {
        const char* s = strings[i];
        if(!s)
            return true;
        unsigned int len = strlen(s);
        if(len > bufsize)
            return false;
        strcpy(result, s);
        bufsize -= len * sizeof(char);
        result += len * sizeof(char);
        if(i < 3 && strings[i+1]) {
            if(bufsize > 0) {
                result[0] = '/';
                --bufsize;
                ++result;
            }
            else
                return false;
        }
    }
    return true;
}

int main()
{
  char result[80] = {0};
  const char* a = "ab";
  const char* b = "xyziuehfih";
  const char* c = "ihihfeih";
  strconcat(result, 80, a, a, b, 0);
  std::cout << result << "\n";
}