困惑:C中的指针和字符数组

时间:2012-07-16 13:17:10

标签: c pointers strtok character-arrays

我是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!”

4 个答案:

答案 0 :(得分:1)

看起来你的第一个标记是一个字符串,第二个标记是一个长标记。您可以使用strncpyparam复制到action,然后strtoulunsigned 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, &param, 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