【发布时间】:2018-04-08 01:31:45
【问题描述】:
您好,我正在使用创建一个包含用户列表的简单程序(基于下面的结构),并且我正在尝试根据用户输入创建新用户,其中我使用 @ 分别请求每个属性987654321@。但是我在结构限制方面遇到了麻烦,例如 id 应该最多 10 个字符,而 nome 最多可以有 25 个字符。这是我的代码以获得更多上下文:
struct user {
char id[10];
char name[25];
char group;
float score;
};
struct user list[25];
int registered = 0;
void createNewUser() {
struct user *userPtr, newUser;
userPtr = &newUser;
printf("\nId: ");
scanf("%10s", &(*userPtr).id);
printf("\nName: ");
scanf("%25s", &(*userPtr.name);
printf("\nGroup: ");
scanf("%c", &(*userPtr).group);
printf("\nScore: ");
scanf("%f", &(*userPtr).score);
insert(newUser);
printf("%10s\n", list[0].id);
printf("%25s\n", list[0].name);
printf("%c\n", list[0].group);
printf("%.1f\n", list[0].score);
}
void insert(struct user newUser) {
if (registered < 25){
list[registered] = newUser;
registered += 1;
}
}
使用我上面提供的代码,如果我为第一个输入键入超过 10 个字符,则忽略接下来的 2 个字符。而我的第三个 scanf 总是被忽略,一个用于组。这里有人可以帮我解决这个问题吗?
【问题讨论】:
-
关于:
struct user *userPtr, newUser;这会将“新用户”放入堆栈。它应该通过动态内存 I.E.在堆上,通过调用malloc()或calloc()。否则,当函数:createNewUser()退出时,它会被破坏(和未定义的行为)。 -
关于:scanf("%10s", &(*userPtr).id);`(和类似的语句)输入格式说明符:'%s' 总是在输入中附加一个 NUL 字节,所以 MAX Characters 修饰符(即 10)应该比输入缓冲区的长度小 1(即应该是 9)
-
在 C 中,当仅通过其名称引用数组时,数组名称会降级为数组第一个字节的地址。所以这一行:
scanf("%10s", &(*userPtr).id);应该是:scanf( "%9s", userPtr->id );。结构中的其他数组也存在类似的考虑 -
关于:
scanf("%c", &(*userPtr).group);需要消耗/跳过前导“空白”。建议:scanf( " %c", &userPtr->group );。注意格式字符串中的前导空格