我的代码中有一个非常奇怪的问题。 每次我的程序使用scanf获取char变量的值之后,它会混乱接下来发生的所有事情,并在循环开始时跳过gets(菜单)。 不使用scanf时不会发生这种情况。有什么想法吗?
void main()
{
char menu[20] = { 0 }, ch, ch2 = 0, str[SIZE] = { 0 }, str2[SIZE] = { 0 }, mat[SIZE][SIZE] = { 0 };
int boo = 1, loop = 0, num;
while (loop == 0)
{
printMenu();
gets(menu);
num = menuNum(menu);
switch (num)
{
case 0:
loop = 100;
break;
case 1:
boo = 1;
printf("Please enter a long string\n");
gets(str);
printf("Please choose separation character\n");
scanf("%c", &ch);
createMat(str, ch, mat);
break;
case 2:
if (mat[0][0] == '\0')
printf("Matrix does not exist!\n");
else
{
printMatrix(mat);
}
break;
case 3:
boo = longShort(mat);
break;
case 4:
printf("Please enter a long string\n");
gets(str2);
printf("Please choose separation character\n");
scanf("%c", &ch);
compareMat(str2, ch2, mat);
break;
default:
printf("Not a valid option!\n");
}
}
}
答案 0 :(得分:0)
scanf("%c", &c);
从输入流中读取一个字节,并将其余的输入保留为挂起状态,因此下一个gets
将读取待处理的换行符,并且无法等待用户输入。
您可以轻松修复代码:
gets
因为此功能不安全且已从C标准中移除,请使用fgets()
内容。fgets()
将用户输入读入数组,并将该数组的第一个字符用作char
值。 gets()
和fgets()
之间的区别在于您将目标数组的大小提供给fgets()
,这可以防止过长的输入导致混乱。但请注意,如果数组足够大并且在文件结束之前输入流中确实存在换行符,那么尾随换行符'\n'
将出现在数组的末尾,在空终止符之前。你需要自己处理它,忽略它或删除它。