关于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之后不是都会在缓冲区里遗留一个换行符的吗? '\n'是字符型常量,第二次scanf读的是%d,会从缓冲区的整型数据开始读。如果第二个scanf读的是%c就会被'\n'影响到 本帖最后由 jackz007 于 2022-4-29 19:00 编辑
在使用完 scanf() 函数后,键盘缓冲区内确实会遗留一个 '\n',但是,这个 '\n' 会被后续的 scanf() 视为一个空白分隔符,因而,并不会影响后续 scanf() 的运行结果。
如果调用 scanf() 函数后,在键盘缓冲区内还有遗留的 ’\n’ 的时候,继续调用 getchar()、gets()、fgets( , , stdin) 等函数时,这个被遗留的 ’\n’ 字符会成为这些函数的一次输入,而这并非我们预期的效果,所以,为了消除这个不利影响,才会需要清空键盘缓冲区,当然,使用 getchar() 是一种方法,但是,不是专业的方法,因为,C 语言有一个标准库函数 fflush() 可以专门解决此问题:
fflush(stdin) ;
楼主不妨一试。 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]