gpt4 book ai didi

c - scanf for c 代码中的 char 错误

转载 作者:行者123 更新时间:2023-11-30 16:32:54 25 4
gpt4 key购买 nike

我的代码中遇到了一个非常奇怪的问题。每次我的程序使用 scanf 获取 char 变量的值时,它都会弄乱接下来发生的所有事情并跳过循环开头的 gets(menu) 。不使用 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");
}
}
}

最佳答案

scanf("%c", &c); 从输入流中读取单个字节并保留其余输入待处理,因此下一个 gets 将读取挂起的换行符并且无法等待用户输入。

您可以轻松修复代码:

  • 切勿使用gets,因为此函数不安全并且已从 C 标准中删除,请改用 fgets()
  • 使用 fgets() 将用户输入读取到数组中,并使用该数组的第一个字符作为 char 值。

gets()fgets() 之间的区别在于,您向 fgets() 提供目标数组的大小,这会阻止过长的输入会造成困惑。但请注意,如果数组足够大并且换行符确实存在于输入流中之前,则尾随换行符 '\n' 将出现在数组末尾、空终止符之前。文件末尾。您需要自己处理它,要么忽略它,要么删除它。

关于c - scanf for c 代码中的 char 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49956478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com