C 在这段代码中,为什么';ename';是否应为字符指针类型而不是字符数组?
我想使用命令行参数初始化结构,但我被困在这两者之间,这就是为什么我们必须将ename设置为char指针类型而不是char数组C 在这段代码中,为什么';ename';是否应为字符指针类型而不是字符数组?,c,argv,C,Argv,我想使用命令行参数初始化结构,但我被困在这两者之间,这就是为什么我们必须将ename设置为char指针类型而不是char数组 #include<stdio.h> #include<conio.h> struct emp { int eno; char* ename; int esal; }; int main(int argc,int* argv[]) { struct emp e; e.eno
#include<stdio.h>
#include<conio.h>
struct emp
{
int eno;
char* ename;
int esal;
};
int main(int argc,int* argv[])
{
struct emp e;
e.eno = (argv[1]);
e.ename = argv[2];
e.esal = (argv[3]);
printf("%d\n",argv[1]);
printf("%s\n",argv[2]);
printf("%d\n",argv[3]);
return 0;
}
#包括
#包括
结构emp
{
int eno;
char*ename;
国际英语;
};
int main(int argc,int*argv[]
{
结构emp e;
e、 eno=(argv[1]);
e、 ename=argv[2];
e、 esal=(argv[3]);
printf(“%d\n”,argv[1]);
printf(“%s\n”,argv[2]);
printf(“%d\n”,argv[3]);
返回0;
}
您必须从char*
中获取int
。简单的解决方案是使用atoi
,但好的解决方案是使用提供错误检查的strtol
e.eno = atoi(argv[1]);
对于第二种方法,请使用strdup
(假设您的系统上有符合POSIX的strdup
)
但使用上面显示的方法,可以添加一个级别的错误检查和输入代码验证。您已经使用gcc-Wall-Werror progname.c
编译器会向您显示警告
为了澄清一点,e.ename=argv[2]
将衰减的char*
分配给结构实例的ename
成员。在本例中,数组被转换为指向char数组的第一个元素的指针。指向第一个元素的指针只不过是char*
,这就是为什么这里需要char*
。这不是推荐的做法,因为结构实例会产生超出其成员范围的副作用。更改其成员将影响argv[2],反之亦然
如果将char
数组或声明ename
为char
数组,则编写此语句将导致错误。因为数组是不可修改的左值。给他们分配东西是违法的
struct emp
{
int eno;
char ename[MAXLENGTH];
int esal;
};
...
strcpy(e.ename,argv[2]);
在使用strcpy
之前,请验证argv[2]
是否包含可复制到指定char
数组成员中的内容
根据声明的方式,可以使用
ename
成员的不同方式ename
不必是char*
-它也可以是char
数组,但无论您做什么,使用都必须正确 因为您无法分配到数组,就像您在e.ename=argv[2]
中尝试的那样。请在我回答后不要更改。求你了,对不起@coderredoc
struct emp
{
int eno;
char ename[MAXLENGTH];
int esal;
};
...
strcpy(e.ename,argv[2]);