arrays - 什么是创建结构并向其写入元素的正确方法,但在 C 中存在限制
问题描述
我正在创建一个应用程序,访问者在其中输入他们的数据,并且该数据进入一个数组。此外,应用程序也有一些限制,用户最多可以输入 20 个字符的名字和姓氏。我的问题是,我应该在结构中指明什么容量?也许 1024 或只有 20?另外,我应该使用什么扫描方法来获取该数据,因为我使用scanf ("% [^ \ n]% * c")
但也许使用起来更安全gets()
?fgets ()
我还在我的程序中检查了输入长度strlen
,但我不知道它是否真的需要。
typedef struct Guests
{
char Name[20];
char LastName[20];
} Guests
更新:
char name[20];
printf("Please, enter name:");
scanf("%[^ \ n]s", name);
while(check_Input_Name(name)==1 || strlen(name)>=20)
{
printf("You not entered numbers OR name was too long\n");
printf("Please, try again: ");
scanf("%[^ \ n]s", name);
}
bool check_Input_Name(char *Name) {
for(int i=0; Name[i]; ++i)
{
if(isalpha(Name[i])==0 && Name[i]!=' ')
{
return 1;
}
}
if (isupper(Name[0])==0)
{
return 1;
}
for(int i=0; Name[i]; ++i)
{
if(Name[i]==' ')
{
if (isupper(Name[i+1])==0)
{
return 1;
}
}
}
return 0;
}
解决方案
输入例程必须稳健地处理长的,甚至是极端的输入,并确保只有有效数据(有效长度)被移交给进一步处理。
数据应定义为保持允许的最大值,仅此而已。数据结构受到上述健壮输入例程的保护。
推荐阅读
- r - 如何在R中按多个时间范围过滤?
- c# - 将单个 .xaml 文件添加到解决方案时,VSTO 外接程序不再编译
- typescript - Typescript 中展开运算符的属性选择
- azure-devops - 根据计划将不同的参数值传递给 Azure DevOps Pipeline
- mysql - 按订单类型过滤产品
- postgresql - 每个语句插入前的 PostgreSQL 触发器
- date - 昨天的日期在颤抖
- javascript - 在 django 模板中的 js 的 Swiper 功能中创建了重复的元素(产品)
- python - 试图从 pyodbc.drivers() 获取列表,但它什么也没产生,为什么?
- javascript - Discord.js 问题:新用户的用户名显示为未定义