8.5 scanf()与getchar()函数

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

fflush(stdin);

程序实例如下:

/* 按指定行列打印字符 */
#include
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()函数)