美文网首页
8.5 scanf()与getchar()函数

8.5 scanf()与getchar()函数

作者: 日常表白结衣 | 来源:发表于2017-07-11 12:03 被阅读0次

    编写完程序,调试运行,在输入第一组数据时运行良好,但是,当你想输入第二组测试测试数据时,会发现还没有等你输入数据程序就退出了,出现这种情况是紧跟输入行数据后面的换行符的问题。
    1、scanf() 读取数值时,会忽略行开头的所有空格,并以空格、换行符结束输入,换行符(回车符)会残留在缓冲区中
    2、getchar()读取数值时,(从缓冲区)读入以任何字符开始的字符串,并以换行符结束输入(空格不结束),但是 会舍弃最后的回车符(换行符)
    在本例中(在getchar()函数中结束程序),scanf()输入后,会在缓冲区残留下换行符,在输入第二组测试数据时,getchar()函数会直接读取缓冲区残留的换行符,导致程序结束!
    要解决这个问题,就要跳过两轮输入之间的所有换行符或空格,同时,应尽量在scanf()函数阶段终止程序。
    同时C语言中提供了函数清空缓冲区,只要在读取数据之前先清空缓冲区就可以了。
    函数如下:

    fflush(stdin);
    

    程序实例如下:

    /* 按指定行列打印字符 */
    #include<stdio.h>
    void display(char ch, int lines, int width);
    int main()
    {
        int ch, rows, cols;
        printf("enter a character and two integers:\n");
        while ((ch = getcgar()) != '\n')
        {
            //scanf("%d %d",&rows,&cols); 原程序 
            if (scanf("%d %d", &rows, &cols) != 2)  //修改原程序为输入验证式
                break;
            display(ch, rows, cols);
            while (getchar() != '\n') //新增 吃掉换行符
                continue;
            printf("enter another character and two integers;\n");
            printf("enter a newelines to quit.\n");
        }
        printf("bye.\n");
        return 0;
    }
    void display(char cr, int lines, int width)
    {
        int row, col;
        for (row = 1; row <= lines; row++)
        {
            for (col = 1; col <= width; col++)
                putchar(cr);
            putchar('\n'); //结束一行并开始新的一行
        }
    }
    

    相关文章

      网友评论

          本文标题:8.5 scanf()与getchar()函数

          本文链接:https://www.haomeiwen.com/subject/aigphxtx.html