gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:51 25 4
gpt4 key购买 nike

我想使用命令行参数初始化结构,但我被困在这两者之间,为什么我们必须将 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 = (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;
}

最佳答案

那么您必须从 char* 中获取 int。简单的解决方案是使用 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 数组,但无论您做什么,使用都必须正确。

关于c - 在这段代码中,为什么 'ename' 应该是 char 指针类型而不是 char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48576105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com