鱼C论坛

 找回密码
 立即注册
查看: 144|回复: 2

[已解决]printf和scanf问题

[复制链接]
发表于 2024-4-11 16:59:14 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为啥每次程序好像执行到是否打印那里就自己停了?
最佳答案
2024-4-11 17:11:46
本帖最后由 jackz007 于 2024-4-11 17:19 编辑
  1.           scanf("%d" , & n)      ; //  只要使用 scanf() 输入过任何非 %c 型的输入都会导致一个 '\n' 字符滞留在键盘缓冲区
  2. . . . . .
  3.           scanf("%c" , & ch)     ; //  ch 接收到的将是键盘缓冲区中滞留的字符 '\n',而你键入的 'y' 永远也不会被 ch 接收到
复制代码

          所以,正确的做法应该是,在每一次使用 scanf() 获取非 "%c" 型的输入过后,立即使用一个 getchar(),把滞留在键盘缓冲区里的 '\n' 读取出来,然后再来读取下一次的键盘输入。这样,就可以避免因为键盘缓冲区中滞留 '\n' 而给程序运行带来的困扰。
  1.           scanf("%d" , & n)     ;
  2.           getchar()             ; // 添加此句,避免后续键盘输入读到滞留在键盘缓冲区中的 '\n' 字符,干扰程序运行。
  3. . . . . .
  4.           scanf("%c" , & ch)    ;
复制代码

2F08377E-BDB3-4D4F-9717-FE9B9096A3B9.jpeg
9C9EBB62-8967-4A9E-8067-B89EE5F0EC27.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-11 16:59:37 | 显示全部楼层
这可能是因为在使用`scanf`函数时,输入的数据与预期不符导致程序出现停滞。让我们来看一个例子:

  1. #include <stdio.h>

  2. int main() {
  3.     int num;
  4.     printf("请输入一个整数:");
  5.     scanf("%d", &num);

  6.     printf("你输入的整数是:%d\n", num);

  7.     return 0;
  8. }
复制代码


在上面的代码中,我们使用`scanf`函数从用户处接收一个整数,并将其存储到`num`变量中。然后,我们使用`printf`函数打印出该整数。

但是,如果用户在输入整数之后按下了空格键或回车键,`scanf`函数会将空格或回车字符留在缓冲区中。然后,下一次调用`scanf`函数时,它会尝试读取缓冲区中的空格或回车字符。由于`%d`格式要求输入的是整数,因此`scanf`函数无法成功读取这些字符,导致程序陷入停滞。

为了解决这个问题,您可以在`scanf`语句之前使用一个`getchar`函数调用,以清除缓冲区中的任何残留字符:

  1. #include <stdio.h>

  2. int main() {
  3.     int num;
  4.     printf("请输入一个整数:");
  5.     getchar(); // 清除缓冲区中的多余字符
  6.     scanf("%d", &num);

  7.     printf("你输入的整数是:%d\n", num);

  8.     return 0;
  9. }
复制代码


现在,即使用户在输入整数后按下空格键或回车键,程序也能够正常执行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-11 17:11:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-4-11 17:19 编辑
  1.           scanf("%d" , & n)      ; //  只要使用 scanf() 输入过任何非 %c 型的输入都会导致一个 '\n' 字符滞留在键盘缓冲区
  2. . . . . .
  3.           scanf("%c" , & ch)     ; //  ch 接收到的将是键盘缓冲区中滞留的字符 '\n',而你键入的 'y' 永远也不会被 ch 接收到
复制代码

          所以,正确的做法应该是,在每一次使用 scanf() 获取非 "%c" 型的输入过后,立即使用一个 getchar(),把滞留在键盘缓冲区里的 '\n' 读取出来,然后再来读取下一次的键盘输入。这样,就可以避免因为键盘缓冲区中滞留 '\n' 而给程序运行带来的困扰。
  1.           scanf("%d" , & n)     ;
  2.           getchar()             ; // 添加此句,避免后续键盘输入读到滞留在键盘缓冲区中的 '\n' 字符,干扰程序运行。
  3. . . . . .
  4.           scanf("%c" , & ch)    ;
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-17 11:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表