【发布时间】:2021-04-06 23:45:24
【问题描述】:
我正在尝试制作“对象”并稍后在 C 中管理它以“释放”和“重新分配”内存空间,但我在此代码中的输出存在问题:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct {
// Param
char name[16];
char code[16];
} Employee;
void print(Employee *object)
{
printf("\n \n - Name: [%s], Code: [%s]\n", object->name, object->code);
}
int main(){
Employee *aPerson = (Employee *)malloc(sizeof(Employee));
// Setting name:
char select[1];
do {
printf("\nWrite the employee name: ");
scanf("%s", aPerson->name);
printf("\nThe name is <%s>? (y/n): ", aPerson->name);
scanf("%s", &select[0]);
select[0] = tolower(select[0]);
}while(select[0] != 'y');
printf("\n[*]\t%s \n[]\t%s \n[&]\t%s", *aPerson, aPerson, &aPerson->name);
printf("\n[->]\t%s", aPerson->name);
print(aPerson);
}
我意识到,如果我输入“n”并再次设置名称,代码可以工作,但如果我在第一次尝试中获得正确的名称,代码就不起作用,当我遇到这个问题时我的输出是:
> ↑d)}·⌂
你的时间。
【问题讨论】:
-
没有事件查看
scanf("%s", &select[0]);是未定义的行为。您至少需要 2 个字符:一个用于数据,一个用于终止零 - 您只有一个字符的空间。 -
提示:一个数组通常是完全没用的。这相当于
char,它不能保存长度> 0的C字符串。 -
您可能希望使用
char,然后使用scanf("%c", &select)作为单个字符。 -
您应该使用
if( scanf("%15s", aPerson->name) == 1 ) { ... }始终放置一个宽度说明符,这样您就不会溢出数组边界,并始终检查返回值以确保将一些数据写入变量。 -
scanf 使用 %s 会自动添加一个 null,因此如果您的数组大小为 1,您的程序将写入无效的内存区域,从而导致不可预知的行为。我只使用 selected[2] 对其进行了测试,它确实有效。