8.5 scanf()与getchar()函数
2017-07-11 本文已影响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'); //结束一行并开始新的一行
}
}