ffluh(stdin)唤起的差别
ffluh(stdin)引起的差别
一段程序
#define N 2
#define M 3
#include <stdio.H>
int main()
{
int i, j, x[N][M], max, line, col;
printf("input array numbers:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&x[i][j]);
}
}
max=x[0][0];line=col=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(max<x[i][j])
{
max=x[i][j];
line=i;
col=j;
}
}
}
printf("\nmax=%d\tline=%d\tcol=%d\n",max,line+1,col+1);
return 0;
}
这样可以向下面这样输入
1 2 3
4 5 6
但是如果我在scanf语句下面加一句fflush(stdin)就会出现异常。虽然没错,但是运行起来会出现BUG
#define N 2
#define M 3
#include <stdio.H>
int main()
{
int i, j, x[N][M], max, line, col;
printf("input array numbers:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&x[i][j]);
fflush(stdin);
}
}
max=x[0][0];line=col=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(max<x[i][j])
{
max=x[i][j];
line=i;
col=j;
}
}
}
printf("\nmax=%d\tline=%d\tcol=%d\n",max,line+1,col+1);
return 0;
}
这样输入就不止6个数了。。。(格式还是按照上面的输入)。
我想问一下为什么?
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
一段程序
#define N 2
#define M 3
#include <stdio.H>
int main()
{
int i, j, x[N][M], max, line, col;
printf("input array numbers:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&x[i][j]);
}
}
max=x[0][0];line=col=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(max<x[i][j])
{
max=x[i][j];
line=i;
col=j;
}
}
}
printf("\nmax=%d\tline=%d\tcol=%d\n",max,line+1,col+1);
return 0;
}
这样可以向下面这样输入
1 2 3
4 5 6
但是如果我在scanf语句下面加一句fflush(stdin)就会出现异常。虽然没错,但是运行起来会出现BUG
#define N 2
#define M 3
#include <stdio.H>
int main()
{
int i, j, x[N][M], max, line, col;
printf("input array numbers:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&x[i][j]);
fflush(stdin);
}
}
max=x[0][0];line=col=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
if(max<x[i][j])
{
max=x[i][j];
line=i;
col=j;
}
}
}
printf("\nmax=%d\tline=%d\tcol=%d\n",max,line+1,col+1);
return 0;
}
这样输入就不止6个数了。。。(格式还是按照上面的输入)。
我想问一下为什么?
------解决方案--------------------
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。