0

我是 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[] 的子集字符数组直到分隔符,我该怎么办?

编辑:输入是这样的:“left#1000!”

4

4 回答 4

1

看起来您的第一个令牌是一个字符串,而第二个令牌是一个长字符。您可以使用strncpyto 复制paraminto action,然后strtoul解析unsigned longto 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, &param, 10);
于 2012-07-16T13:21:56.133 回答
1

您无法初始化action = *param.

你需要使用

memcpy(action, param, strlen(param))

duration = (unsigned long) atoi(param)
于 2012-07-16T13:25:14.273 回答
1

您应该使用 strcpy() 和必要的转换来在 C 中分配字符串(或字符数组)。

访问http://en.cppreference.com/w/c/string/byte/strcpy

此函数将处理字符串之间的成员分配。要手动执行此操作,您必须使用循环并分别分配每个数组成员。

于 2012-07-16T13:28:38.800 回答
1

这个片段应该在纯 C 中工作(添加了评论)。您可以使用 Cstruct来收集值。Structs 可以从简单数据类型之类的函数返回(如图所示)。您可以将其用作您自己的程序的开始。

编辑:此类程序不需要这些strXYZ(..)功能(如果您的传入数据中可能有'\0'-bytes 则很有用)。

...

#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

于 2012-07-16T13:53:23.040 回答