我是C的新手,试图分割一个字符数组(我从Ardunio的串口接收)。我查了一些教程并想出了这个。请帮我调试一下。
char action[10];
unsigned long duration;
void split(char input[20])
{
char *param, *ptr;
param = strtok_r(input, "#", &ptr);
action = *param; // Need help with this line
param = strtok_r(NULL, "!", &ptr);
duration = (unsigned long) *param; // Need help with this line
}
据我所知,strtok_r在分隔符(#)后面返回一个指向字符的指针。因此,如果我希望action []成为input []的子集字符数组,直到分隔符,我该怎么办?
编辑: 输入是这样的:“左#1000!”
答案 0 :(得分:1)
看起来你的第一个标记是一个字符串,第二个标记是一个长标记。您可以使用strncpy
将param
复制到action
,然后strtoul
将unsigned long
解析为duration
。
param = strtok_r(input, "#!", &ptr);
strncpy(action, param, sizeof(action));
// Force zero termination
action[sizeof(action)-1] = '\0';
param = strtok_r(NULL, "#!", ptr);
duration = strtoul(param, ¶m, 10);
答案 1 :(得分:1)
您无法初始化action = *param
。
您需要使用
memcpy(action, param, strlen(param))
和
duration = (unsigned long) atoi(param)
答案 2 :(得分:1)
你应该使用strcpy()和必要的转换来在C中分配字符串(或char数组)。
访问http://en.cppreference.com/w/c/string/byte/strcpy
此函数将关注字符串之间的membervise赋值。要手动执行此操作,必须使用循环并单独分配每个数组成员。
答案 3 :(得分:1)
此代码段应该在纯C中工作(添加注释)。您可以使用C struct
来收集值。 Struct
可以从简单数据类型等函数返回(如图所示)。您可以将其用作自己程序的开头。
编辑:此类程序不需要strXYZ(..)
函数(如果输入数据中有'\0'
个字节,则非常有用)。
...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct {
char action[10]; unsigned long duration;
} Result;
Result split(char *input, char delim)
{
Result result = {'\0', 0}; // initialize result by zeros
char *p = (char*)memchr(input, delim, sizeof(result.action)-1);
if(p != NULL) { // if delimiter found in input
memcpy(result.action, input, p-input); // copy text till delimiter
result.duration = strtoul(p+1, NULL, 10); // convert number after delimiter
}
return result; // return values
}
int main(char argc, const char*argv[])
{
char input[20] = "left#1000!";
Result result = split(input, '#');
printf("action: %s, duration %u\n", result.action, result.duration);
return 0;
}
...
此致
RBO