困惑:C语言中的指针和字符数组
我是C语言新手,正在尝试拆分字符数组(我从Ardunio中的串行端口接收)。我查阅了一些教程,得出了这个结论。请帮我调试一下困惑: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
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, ¶m, 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, ¶m, 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