#include <iostream>
using namespace std;
int main(){
int a;
while(scanf("%lf",&a) && a){
cout<<a<<"\n";
}
}
//程序二
#include "stdio.h"
int main(){
int a;
while(scanf("%d",&a)&&a){
printf("%d\n",a);
}
return 0;
}
这两个程序的区别就在cout和printf,我执行的结果就是程序二会等到输入0的时候一次性输出所有的数字,但是程序一会在每输入一个数字,并且回车后,立即输出这个数字,按照一直说的cout有缓冲区,printf没有缓冲区的话,不应该出现这样的问题啊。搞不懂怎么回事啊,求大牛解释。
22 个解决方案
#1
谁说printf无缓冲的啊
#2
程序1 %lf 对应的是double ,而你是int a 已经错了。
#3
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
#include <iostream>
using namespace std;
int main(){
int a;
while(scanf("%d",&a) && a){
cout<<a<<"\n";
}
}
#4
改过之后的2个程序运行效果一样
#5
表示没有出现楼主说的问题
#6
scanf("%lf",&a)
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf
#7
我其实就想知道什么情况下是回车立即显示结果,而什么情况下是输入0以后才会显示结果。比如:
输入:
1[回车]
2[回车]
0[回车]
结果有两种:
一种是
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
printf("%d\n",a);
}
return 0;
}
1
2
0
1
2
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
cout<<a<<"\n";
}
return 0;
}
一种会是
1
1
2
2
0
很费解啊。
#8
不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。
#9
你用的啥编译器?
我这里2个代码都行为都是一样的
#10
理解“流”的概念,scanf是从
流当中
按格式提取信息,如果没有合适的信息可提取,那么流是不会动的。
#11
printf一样也有缓冲
#12
同求学习一下!
#13
2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
#14
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
不要写连自己也预测不了结果的代码!
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
不要写连自己也预测不了结果的代码!
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
#15
安装vs的时候装的那个cl编译器。
#16
cl.exe
#17
恩恩,忠告不错。谢谢呢。
#18
vs版本 ?
#19
我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。
#20
应该是你没编译成功吧
#21
学习了 谢谢
#22
成功了,就是运行的时候出问题,应该是在notepad++的控制台在按Enter的时候有什么不同的地方吧。
#1
谁说printf无缓冲的啊
#2
程序1 %lf 对应的是double ,而你是int a 已经错了。
#3
sorry,我贴的时候贴错了,重点是下面的cout和printf啊,
#include <iostream>
using namespace std;
int main(){
int a;
while(scanf("%d",&a) && a){
cout<<a<<"\n";
}
}
#4
改过之后的2个程序运行效果一样
#5
表示没有出现楼主说的问题
#6
scanf("%lf",&a)
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf
scanf("%d",&a)
你确定是这两个程序的区别就在cout和printf
#7
我其实就想知道什么情况下是回车立即显示结果,而什么情况下是输入0以后才会显示结果。比如:
输入:
1[回车]
2[回车]
0[回车]
结果有两种:
一种是
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
printf("%d\n",a);
}
return 0;
}
1
2
0
1
2
#include "iostream"
using namespace std;
int main()
{
int a;
while(cin>>a&&a)
{
cout<<a<<"\n";
}
return 0;
}
一种会是
1
1
2
2
0
很费解啊。
#8
不要混用C的scanf/printf和C++的cin/cout。两者各自有自己的缓冲区,虽然有同步机制,但是有时的确不会按照你想的来。一个缓冲区刷新了,另外一个不一定也同步刷新。
#9
你用的啥编译器?
我这里2个代码都行为都是一样的
#10
理解“流”的概念,scanf是从
流当中
按格式提取信息,如果没有合适的信息可提取,那么流是不会动的。
#11
printf一样也有缓冲
#12
同求学习一下!
#13
2个的运行效果应该是一样的啊,LZ用的什么编译器啊,说明一下可以么
#14
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
不要写连自己也预测不了结果的代码!
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
不要写连自己也预测不了结果的代码!
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
#15
安装vs的时候装的那个cl编译器。
#16
cl.exe
#17
恩恩,忠告不错。谢谢呢。
#18
vs版本 ?
#19
我发现,可能和notpad++有关系的,之前虽然有几次在vs2008下面运行出现两种结果不一样的情况,但是后面修改了“%lf”->“%d”的错误之后,在vs2008下面就没再出现这样的问题。但是我用notepad++配置了cl.exe 编译器编译运行的时候,就会出现上述的两种结果不一样的情况。虽然最后也没有解决,不过既然这样的话,估计应该是cl和notepad++结合的时候,出现的什么状况吧。
#20
应该是你没编译成功吧
#21
学习了 谢谢
#22
成功了,就是运行的时候出问题,应该是在notepad++的控制台在按Enter的时候有什么不同的地方吧。