C 为什么我的代码忽略我的fgets()并给它一个0值?

C 为什么我的代码忽略我的fgets()并给它一个0值?,c,C,缓冲区溢出导致fgets在不接收用户的任何stdin的情况下获取新行。如果在使用stringswap()之前使用函数清除缓冲区,程序运行正常,我可以更改字符串的值并将其打印出来。然而,我想知道缓冲区溢出是从哪里产生的,以避免这种情况再次发生 #包括 #包括 #包括 #包括 #包括 char-arg[100]; 无效选项(); int AskChoice(); void stringswap(); 无效清除(); int main() { 选项(); 返回0; } 无效选项() { int-cho

缓冲区溢出导致
fgets
在不接收用户的任何stdin的情况下获取新行。如果在使用
stringswap()
之前使用函数清除缓冲区,程序运行正常,我可以更改字符串的值并将其打印出来。然而,我想知道缓冲区溢出是从哪里产生的,以避免这种情况再次发生

#包括
#包括
#包括
#包括
#包括
char-arg[100];
无效选项();
int AskChoice();
void stringswap();
无效清除();
int main()
{
选项();
返回0;
}
无效选项()
{
int-choice=0;
choice=AskChoice();
如果(选项==1){
字符串交换(arg);
printf(“您的单词是%s\n”,arg);
选项();
}
else if(选项==2){
printf(“再见”);
}
否则{
选项();
}
}
int AskChoice()
{
int-choice=0;
字符选择[2];
printf(“输入1表示一个单词,输入2表示退出程序。\n”);
fgets(选择,2,标准);
choice=atoi(choice);
printf(“您的选择是%d\n”,选择);
回报选择;
}
无效字符串交换(字符*输入)
{
printf(“输入新字符串”);
fgets(输入,50,标准输入);
}
无效清除()
{
而(getchar()!='\n')
;
}

我希望输入一个单词并将其重复给我,但是它被完全忽略,我得到了一个返回的空格。

2足以得到1
char
,然后附加一个空字符。因此,每次调用仅消耗用户的1个字符。没有足够的每个OP的需求

使用较大的缓冲区

// char Choice[2];
char Choice[100];
printf("Enter 1 to say a word, enter 2 to exit program.\n");
// fgets(Choice, 2, stdin);
fgets(Choice, sizeof Choice, stdin);

按键盘上的
Enter
键也会在缓冲区的末尾添加
\n
,这就是为什么您会得到一个空白返回。scanf就是这样,但我不记得FGET是否也是这样。“存在缓冲区溢出”-当然存在,而且您似乎知道这一点。所以修好它
fgets
正在写入三个字符,包括终止符。您的程序调用未定义的行为。首先修复此问题。您没有检查
fgets
的返回值。您的输入需要
“1\n\0”
(3个字符)。当您指定
2
作为
fgets
的限制时,
fgets
“1\0”
写入缓冲区,使
中的
'\n'
处于未读状态。您对
fgets
的下一次调用将读取到第一个
'\n'
(这是
stdin
中的第一个字符,显示正在跳过
fgets
)。不是,它只是在读你在
stdin
中留下的
'\n'
而已。虽然@Kingsley提出了一个很好的建议,但在这种情况下,
sizeof(Choice)
仍然是
2
。按照一般规则,永远不要忽略缓冲区大小,
#define MAXCHOICE 512。。。字符选择[MAXCHOICE]然后遵循上述建议,然后验证
size\u len=strlen(选项);如果(len==MAXCHOICE-1&&Choice[len-1]!='\n')/*句柄输入超过缓冲区大小错误*/