鱼C论坛

 找回密码
 立即注册
查看: 1673|回复: 3

[已解决]关于scanf问题,求助

[复制链接]
发表于 2022-4-29 17:29:34 | 显示全部楼层 |阅读模式

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

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

x
在小甲鱼的这段代码里
  1. void write_matrix(int *ptr)
  2. {
  3.         int m = ptr[0];
  4.         int n = ptr[1];
  5.         int *matrix = ptr + 2;
  6.         int num, x, y;

  7.         if (ptr == NULL)
  8.         {
  9.                 printf("未检测到矩阵,请先生成矩阵!\n");
  10.                 return ;
  11.         }

  12.         printf("请输入要修改的位置(行,列)-> ");
  13.         scanf("%d,%d", &x, &y);

  14.         if (x > m || y > n || x < 1 || y < 1)
  15.         {
  16.                 printf("坐标输入有误!\n");
  17.                 return ;
  18.         }

  19.         printf("请输入一个数字:");
  20.         scanf("%d", &num);

  21.         matrix[(x - 1) * n + (y - 1)] = num;
  22. }
复制代码


在这段代码中的
  1.         scanf("%d,%d", &x, &y);

  2.         if (x > m || y > n || x < 1 || y < 1)
  3.         {
  4.                 printf("坐标输入有误!\n");
  5.                 return ;
  6.         }

  7.         printf("请输入一个数字:");
  8.         scanf("%d", &num);
复制代码

这一部分
为什么它在使用scanf后可以不用getchar()清空缓冲区的\n就可以再次使用scanf啊?
在我的理解中在使用scanf之后不是都会在缓冲区里遗留一个换行符的吗?
最佳答案
2022-4-29 17:55:44
本帖最后由 jackz007 于 2022-4-29 19:00 编辑

         在使用完 scanf() 函数后,键盘缓冲区内确实会遗留一个 '\n',但是,这个 '\n' 会被后续的 scanf() 视为一个空白分隔符,因而,并不会影响后续 scanf() 的运行结果。
         如果调用 scanf() 函数后,在键盘缓冲区内还有遗留的 ’\n’ 的时候,继续调用 getchar()、gets()、fgets( , , stdin) 等函数时,这个被遗留的 ’\n’ 字符会成为这些函数的一次输入,而这并非我们预期的效果,所以,为了消除这个不利影响,才会需要清空键盘缓冲区,当然,使用 getchar() 是一种方法,但是,不是专业的方法,因为,C 语言有一个标准库函数 fflush() 可以专门解决此问题:
  1. fflush(stdin) ;
复制代码

        楼主不妨一试。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-29 17:43:29 | 显示全部楼层
'\n'是字符型常量,第二次scanf读的是%d,会从缓冲区的整型数据开始读。如果第二个scanf读的是%c就会被'\n'影响到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 17:55:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-4-29 19:00 编辑

         在使用完 scanf() 函数后,键盘缓冲区内确实会遗留一个 '\n',但是,这个 '\n' 会被后续的 scanf() 视为一个空白分隔符,因而,并不会影响后续 scanf() 的运行结果。
         如果调用 scanf() 函数后,在键盘缓冲区内还有遗留的 ’\n’ 的时候,继续调用 getchar()、gets()、fgets( , , stdin) 等函数时,这个被遗留的 ’\n’ 字符会成为这些函数的一次输入,而这并非我们预期的效果,所以,为了消除这个不利影响,才会需要清空键盘缓冲区,当然,使用 getchar() 是一种方法,但是,不是专业的方法,因为,C 语言有一个标准库函数 fflush() 可以专门解决此问题:
  1. fflush(stdin) ;
复制代码

        楼主不妨一试。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-29 19:46:14 | 显示全部楼层
jackz007 发表于 2022-4-29 17:55
在使用完 scanf() 函数后,键盘缓冲区内确实会遗留一个 '\n',但是,这个 '\n' 会被后续的 scanf( ...

linux 下实测无效

  1. $ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     getchar();
  5.     fflush(stdin);
  6.     char buff[1024];
  7.     fgets(buff, 1024, stdin);
  8.     puts(buff);
  9.     return 0;
  10. }
  11. $ gcc-debug -o main main.c
  12. $ ./main
  13. 1234
  14. 234

  15. $
复制代码


http://www.cplusplus.com/reference/cstdio/fflush/?kw=fflush
  1. In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 10:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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