我有结构:
typedef struct _client
{
char num[9];
char some[12];
} person;
并且我想为该字符串输入值,我有该代码,并且在迭代中,它跳过了第一个输入,然后转到第二个。为什么从输入跳到num[9]
字符串并转到some[12]
?
int i;
person* arrClient = (person*)malloc(sizeof(person)*size);
for (i = 1; i <= size; i++)
{
gets(arrClient[i].num);
gets(arrClient[i].some);
}
将数组约束移出边界会导致不确定的行为。
循环for (i = 1; i <= size; i++)
就是那样,将其替换为for (i = 0; i < size; i++)
。
[gets()
]功能不再是C标准的一部分,由于其易受攻击性,从ISO C11开始将其删除:
[第一个Internet蠕虫(Morris Internet Worm)大约在30年前(1988-11-02)逃脱了,它使用gets()和缓冲区溢出作为其在系统之间传播的方法之一。基本问题是该函数不知道缓冲区有多大,因此它将继续读取直到找到换行符或遇到EOF为止,并且可能会溢出给定缓冲区的界限。
因此使用:
fgets(arrClient[i].num, sizeof(arrClient[i].num), stdin);
arrClient[i].num[strcspn(arrClient[i].num, "\n")] = '\0'; //remove '\n'
第二个输入相同。