gandixiwang 发表于 2022-4-29 17:29:34

关于scanf问题,求助

在小甲鱼的这段代码里
void write_matrix(int *ptr)
{
      int m = ptr;
      int n = ptr;
      int *matrix = ptr + 2;
      int num, x, y;

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

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

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

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

      matrix[(x - 1) * n + (y - 1)] = num;
}

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

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

      printf("请输入一个数字:");
      scanf("%d", &num);
这一部分
为什么它在使用scanf后可以不用getchar()清空缓冲区的\n就可以再次使用scanf啊?
在我的理解中在使用scanf之后不是都会在缓冲区里遗留一个换行符的吗?

风车呼呼呼 发表于 2022-4-29 17:43:29

'\n'是字符型常量,第二次scanf读的是%d,会从缓冲区的整型数据开始读。如果第二个scanf读的是%c就会被'\n'影响到

jackz007 发表于 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() 可以专门解决此问题:
fflush(stdin) ;
      楼主不妨一试。

人造人 发表于 2022-4-29 19:46:14

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

linux 下实测无效

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

int main(void) {
    getchar();
    fflush(stdin);
    char buff;
    fgets(buff, 1024, stdin);
    puts(buff);
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
1234
234

$

http://www.cplusplus.com/reference/cstdio/fflush/?kw=fflush
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).
页: [1]
查看完整版本: 关于scanf问题,求助