在 Arduino 程序中输出错误

Having a bad output in Arduino program

我对这个 Arduino 程序有疑问 这是我的代码


char *stringsplit(char msg[])
 
{
  char *words[4];
   char * p;
  int i = 0;
   char dauphay[] = ",";
  p = strtok(msg, dauphay);
 while(p && i < 4)
  {
    words[i] = p;
    p = strtok(NULL, dauphay);
    ++i;
  }
  return *words;
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  char msg[]="first,Second,third,four";
  char *p1=stringsplit(msg);
for(int i = 0; i < 4; i++)
  {
    Serial.println(p1[i]);
  }
}
void loop() {
  // put your main code here, to run repeatedly:

}

我的预期输出是“First Second Third Four” 但我的实际输出是“F i r s” 我应该怎么做才能解决这个问题

stringsplit(),你return*words。这与

相同
return words[0];

也就是说,returned指针指向第一个字符串,即first。 然后,循环依次打印每个元素(字符)

f
i
r
s

要解决这个问题,您必须 return 整个数组,即指向 words 的指针。这会将签名和 return 更改为

char **stringsplit(char msg[])
{
    // ...

    return words;
}

但这也行不通,因为现在 stringsplit return 是一个指向局部变量的指针。


有几种方法可以解决这个问题

  • 使words静态化,例如

    static char *words[4];
    
  • 或者使用动态内存分配

    char **words = malloc(4 * sizeof(char*));
    
  • 或者将words数组传入stringsplit

    char **stringsplit(char msg[], char **words)
    {
        // ...
    }
    

    然后在 setup()

    char *words[4];
    char **p1 = stringsplit(msg, words);
    

每种方法都有其优点和缺点。在这个小的 Arduino 示例中(虽然我不是专家),我更喜欢静态变体,因为它快速简单(有些人会说脏 ;-),即使最后一种方法是最干净的。


看@Furkan 的提示,内联打印似乎是最好的解决方案。这也很容易允许任意数量的子字符串

char *p;
char dauphay[] = ",";
p = strtok(msg, dauphay);
while (p) {
    Serial.println(p);
    p = strtok(NULL, dauphay);
}