为什么gets()是跳过值输入?

问题描述 投票:0回答:1

我有结构:

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);
}
c gets
1个回答
0
投票

将数组约束移出边界会导致不确定的行为。

循环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'

第二个输入相同。

© www.soinside.com 2019 - 2024. All rights reserved.