【发布时间】:2020-05-05 13:16:54
【问题描述】:
我知道下面的代码无效,因为 %s 需要 char * 类型的参数,但我给出了 char ** 类型的参数。
#include <stdio.h>
struct employee
{
int id;
char name[20];
float salary;
};
int main(void)
{
struct employee e;
scanf("%19s", &e.name);//Invalid line
printf("%s", e.name);
}
但我收到了不同的警告:
./ Playground / file0. c: In function main:. / Playground / file0. c: 11: 15: warning: format '% s' expects argument of type' char * ', but argument2 has type char (*) [20]' [- Wformat =] 11 | scanf ("% 195", & e. name); | char (*) [20] char *
我很确定char ** 和char (*)[20] 在某种程度上是等价的,但不确定它们是怎样的。
char **:指向一个字符的指针。
char (*)[20]:指向 char 的指针数组。 — 不确定我是否完全正确。
我不明白。它们如何等效?请赐教。
【问题讨论】:
-
@user3121023 请再次阅读问题。
-
char (*)[20]首先是括号,然后是从右到左:。与 char *[20]比较(无括号,从右到左阅读):. -
一些编译器在这方面比其他编译器更挑剔。但是,您可以使用
e.name作为scanf()的参数,原因与您可以使用e.name作为printf()的参数相同。你不需要&。 -
您的无效行应更改为
scanf("%19s", e.name);或scanf("%19s", &e.name[0]);,因为scanf的%s说明符需要char *参数。 (对于e.name,char [20]左值将衰减为char *。)