我想使用命令行参数初始化结构,但我之间陷入困境,为什么我们必须使用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 = (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;
}
答案 0 :(得分:1)
你必须从int
获得char*
。简单的解决方案是使用atoi
,但好的解决方案是使用提供错误检查的strtol
。
e.eno = atoi(argv[1]);
对于第二个使用strdup
(假设您的系统上存在POSIX兼容strdup
)。
e.ename = strdup(argv[2]);
但是,对于上面显示的方法,请添加级别错误检查和输入代码验证。您已使用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
数组,但无论你做什么,使用都必须正确。