在这段代码中,为什么' ename'应该是char指针类型而不是char数组?

时间:2018-02-02 05:14:59

标签: c argv

我想使用命令行参数初始化结构,但我之间陷入困境,为什么我们必须使用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;
}

1 个答案:

答案 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数组,但无论你做什么,使用都必须正确。