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

困惑:C语言中的指针和字符数组,c,pointers,strtok,character-arrays,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 wi

我是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[]成为输入[]的子集字符数组,直到分隔符为止,我应该怎么做

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

看起来第一个标记是字符串,第二个标记是长字符串。您可以使用将
参数
复制到
操作
,然后将
无符号长
解析为
持续时间

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);

看起来第一个标记是字符串,第二个标记是长字符串。您可以使用将
参数
复制到
操作
,然后将
无符号长
解析为
持续时间

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);

无法初始化
操作=*param

你需要使用

memcpy(action, param, strlen(param))


无法初始化
操作=*param

你需要使用

memcpy(action, param, strlen(param))

为了在C中分配字符串(或字符数组),应该使用strcpy()和必要的强制转换

拜访

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

您应该使用strcpy()和必要的强制转换,以便在C中分配字符串(或字符数组)

拜访


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

此代码段应使用普通C语言(添加注释)。您可以使用C
struct
来收集值<代码>结构s可以从简单数据类型等函数返回(如图所示)。你可以把它作为你自己计划的开始

编辑:此类程序不需要strXYZ(..)函数(如果传入数据中可能包含
'\0'
-字节,则此函数非常有用)

。。。
#包括
#包括
#包括
类型定义结构{
字符操作[10];无符号长持续时间;
}结果;
结果拆分(char*输入,char delim)
{
结果结果={'\0',0};//用零初始化结果
char*p=(char*)memchr(input、delim、sizeof(result.action)-1);
if(p!=NULL){//if在输入中找到分隔符
memcpy(result.action,input,p-input);//将文本复制到分隔符
result.duration=strtoul(p+1,NULL,10);//转换分隔符后的数字
}
返回结果;//返回值
}
int main(字符argc,常量char*argv[]
{
字符输入[20]=“左#1000!”;
结果=拆分(输入“#”);
printf(“操作:%s,持续时间%u\n”,result.action,result.duration);
返回0;
}
...
问候


rbo

此代码段应使用普通C语言(添加注释)。您可以使用C
struct
来收集值<代码>结构s可以从简单数据类型等函数返回(如图所示)。你可以把它作为你自己计划的开始

编辑:此类程序不需要strXYZ(..)函数(如果传入数据中可能包含
'\0'
-字节,则此函数非常有用)

。。。
#包括
#包括
#包括
类型定义结构{
字符操作[10];无符号长持续时间;
}结果;
结果拆分(char*输入,char delim)
{
结果结果={'\0',0};//用零初始化结果
char*p=(char*)memchr(input、delim、sizeof(result.action)-1);
if(p!=NULL){//if在输入中找到分隔符
memcpy(result.action,input,p-input);//将文本复制到分隔符
result.duration=strtoul(p+1,NULL,10);//转换分隔符后的数字
}
返回结果;//返回值
}
int main(字符argc,常量char*argv[]
{
字符输入[20]=“左#1000!”;
结果=拆分(输入“#”);
printf(“操作:%s,持续时间%u\n”,result.action,result.duration);
返回0;
}
...
问候


rbo

数组是特殊的,除了声明之外,不能用
=
运算符“赋值”。这里需要指针
char*action
。您需要先将字符转换为数字(在本例中使用
strtoul
),才能获得
无符号长字符串的持续时间。您可以发布一个源字符串的示例吗?它是否像
param#duration.NNN
?如果您的输入使用
作为终止标记,将其添加到分隔符列表中:
“#!”
数组是特殊的,不能使用
=
运算符“赋值”,除非声明。这里需要指针
char*action
。您需要先将字符转换为数字(在本例中使用
strtoul
),才能获得
无符号长字符串的持续时间。您可以发布一个源字符串的示例吗?它是否像
param#duration.NNN
?如果您的输入使用
作为终止标记,将其添加到分隔符列表中:
“#!”
谢谢。成功了。我不明白的是:这里的param是一个指针。那么strncpy如何使用它作为参数呢?@ask,因为数组会衰减为指针,指针可以指向分配的内存块,
strncpy
不假设它的输入是数组,而是假设它们是指针。它只是从它们指向的位置开始读取,直到看到NUL为止(或者写入它们指向的位置,直到另一个字符串结束)。你应该学习更多关于函数、数组和指针的知识,最好是从书本上学习。谢谢。我主要使用Java,所以我对C类指针的基本概念只有基本的了解。我一定会查的。@downvoter你介意至少粗略地解释一下为什么你否决了一个被接受的答案吗?谢谢。那个wo