在 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);
}
我对这个 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);
}