gpt4 book ai didi

c - 如何在 C 的循环中正确使用 scanf 和数组?

转载 作者:行者123 更新时间:2023-12-04 15:29:25 25 4
gpt4 key购买 nike

我是 C 编程的新手,我不知道自己做错了什么。我有一个 main 方法,我做了一个结构。

我需要在该结构的 main 中创建一个数组,然后在 for 循环中通过 scanf 分配值。

我的程序编译没有错误,但在控制台中输入任何内容后,它会抛出我不理解的异常。我得到的异常(exception)是:

Warning C4477   'scanf_s' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'char **'

Warning C4473 'scanf_s' : not enough arguments passed for format string

这是我的代码的样子:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct Employee {
char *ccFirstName;
char *ccLastName;
int iAge;
};

int main(void) {
struct Employee sExampleEmployee[3];

for (int i = 0; i < 3; i++) {
printf("Geben Sie den Namen :");
sExampleEmployee[i].ccFirstName = scanf_s("%s", &sExampleEmployee->ccFirstName);
sExampleEmployee[i].ccLastName = scanf_s("%s", &sExampleEmployee->ccLastName);
sExampleEmployee[i].iAge = scanf_s("%d", &sExampleEmployee->iAge);
}

for (int i = 0; i < 3; i++) {
printf("First name of the employee: %s", sExampleEmployee[i].ccFirstName);
printf("Last name of the employee : %s", sExampleEmployee[i].ccLastName);
printf("Age of the employee: %d", sExampleEmployee[i].iAge);
}
return EXIT_SUCCESS;
}

最佳答案

您似乎有几个“困惑点”!

首先,scanf_s的返回值函数不是读取的实际值,而是成功扫描的项目的数量。所以,你的作业就像 sExampleEmployee[i].ccFirstName = scanf_s(...不会像您认为的那样做任何事情。

其次,你的sExampleEmployee-> usage 不会获取任何结构的结构字段,但第一个 - 作为没有 [] 的数组名称使用实际上,索引将是指向数组的第一个 成员的指针。 (请参阅数组的下一点!)

第三(而且非常重要),你还没有为 ccFirstName 分配任何内存和 ccLastName结构成员——它们只是未初始化的指针。您最好将它们声明为固定长度的数组:足够长以容纳任何可能的输入加上所需的终止nul性格。

最后(一个更微妙的问题),当你在 %s 中有一个字符串参数(对应于 scanf_s 格式说明符)时函数,您需要添加一个额外的参数(紧跟在字符串之后)指定该字符串缓冲区的大小(以防止读取太多字符)。

因此,考虑到这些要点,您应该重新定义您的结构,并按照以下几行重新编写您的输入循环:

#define MAXNAMELEN 100 // Use whatever value you want - this will allow 99 letters
struct Employee
{
char ccFirstName[MAXNAMELEN];
char ccLastName[MAXNAMELEN];
int iAge;
};
//...
for (int i = 0; i < 3; i++)
{
printf("Geben Sie den Namen :");
scanf_s("%s", sExampleEmployee[i].ccFirstName, MAXNAMELEN); // Arrays (strings) are automatically...
scanf_s("%s", sExampleEmployee[i].ccLastName, MAXNAMELEN); // ... pointers!
scanf_s("%d", &(ExampleEmployee[i].iAge)); // But integers need the "&"
}

编辑:有关 scanf_s 的更多信息功能,see here .重要的部分(对于你的情况)是这样的:

Unlike scanf and wscanf, scanf_s and wscanf_s require you to specify buffer sizes for some parameters. Specify the sizes for all c, C, s, S, or string control set [] parameters. The buffer size in characters is passed as an additional parameter. It immediately follows the pointer to the buffer or variable.

注意:正如在 MS 文档中所见,%s 指针后的大小参数类型为 unsigned对于 Microsoft 的实现 scanf_s , 而它的类型必须是 rsize_t根据 C 标准附录 K。类型 rsize_t在那里指定为与 size_t 相同其大小可能与 unsigned int 不同, 实际上它在 Linux 和 Windows 的 64 位体系结构上都适用,因此 MS 文档指定 The size 参数的类型为 unsigned , 不是 size_t .使用静态转换来转换 size_tunsigned对于 64 位构建配置,一种非常特殊的可移植性方法。

出于这个和其他原因,scanf_s不应在可移植代码中使用。

关于c - 如何在 C 的循环中正确使用 scanf 和数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61550435/

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