鱼C论坛

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

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

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

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

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

x
在小甲鱼的这段代码里
void write_matrix(int *ptr)
{
        int m = ptr[0];
        int n = ptr[1];
        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: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) ;
        楼主不妨一试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-29 17:43:29 | 显示全部楼层
'\n'是字符型常量,第二次scanf读的是%d,会从缓冲区的整型数据开始读。如果第二个scanf读的是%c就会被'\n'影响到
想知道小甲鱼最近在做啥?请访问 -> 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() 可以专门解决此问题:
fflush(stdin) ;
        楼主不妨一试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1024];
    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).
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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