关于输入流的问题

时间:2023-02-24 22:15:37
#include<iostream.h>
void main()
{
float c,f;
char an;
do
{
cout<<"enter the c: ";
cin>>c;
f=9.0/5*c+32;
cout<<"F="<<f<<endl;
cout<<"do you want to use it again:(y/n) ";
cin>>an;
}while(an=='y');

}
用上面那这些代码可以不停地输入求值
#include<stdio.h>
void main()
{
float c,f;
char an;
do
{
printf("enter the c: ");
scanf("%f",&c);
getchar();//要多写一个来吃掉回车
f=9.0/5*c+32;
printf("F=%f\n",f);
printf("do you want to use it again:(y/n) ");
scanf("%c",&an);
}while(an=='y');

}
以上代码如无getchar就不行。
请大侠们说说原因,谢谢^o^

21 个解决方案

#1


C和C++对输入输出流的处理如何不同?

#2


printf("enter the c: ");
scanf("%f",&c);
getchar();//要多写一个来吃掉回车?
改为:
printf("enter the c: ");
scanf("%f",&c);
fflush(stdin);
清空输入缓冲区就行了。^_^

#3


cin为什么没有这回事?

#4


错了, CIN也会有这种错误, 只是你的编译器不是老式的, 所以就没有了.

流处理的时候不只是输入输出, 还有一个刷新的过程, 在C++里是flush, endl里面就含有这个函数.

#5


endl是输出的,输入的呢?

#6


在输入缓冲区里面取出一个字符,其实就是吃掉最后的回车符!

#7


自已up

#8


c的输入和输出是'字节流',输入和输出的数据流的开始和结束受程序控制而不受物理符号(如回车符换行符)的控制。所以你的键盘输入会全部记录到缓冲区,具体怎么取不同的函数处理方式不同。
你取数据的方式是float,所以那个结束符会一直留在输入缓冲区中。
而cin<<f;
用将输入定位到istream流,这次输入的东东已经在istream中了,输入缓冲区中已经没有了东东,所以...

#9


scanf("%c",&an); 你最后在取数据时用的类型是char,而回车就是一个char,所以scanf认为那个东东就是输入结束标志,所以....

#10


你取数据的方式是float,所以那个结束符会一直留在输入缓冲区中。?
我改成int也是这样的

#11


c的输入和输出是'字节流',输入和输出的数据流的开始和结束受程序控制而不受物理符号(如回车符换行符)的控制。所以你的键盘输入会全部记录到缓冲区,具体怎么取不同的函数处理方式不同。
再看看上面的东东,

#12


这次输入的东东已经在istream中了,输入缓冲区中已经没有了东东?
在http://expert.csdn.net/Expert/topic/2061/2061686.xml?temp=.1093408这个贴子里面
 xueweizhong(薛卫忠) 的回答里面
有这么几句话:
Enter a number: 1     \n<---按回车键
                    这时buffer = "1    \n";
cin >> n; 返回后-----> n = 1, buffer = "    \n";
buffer里面还有东东啊

#13


呵呵,可能我错了吧?^_^,那么他后来怎么回答了?
cin是什么,是std::basic_istream<char,std::char_traits<char>>
来自msdn:
explicit basic_istream(
   basic_streambuf<Elem, Tr> *_Strbuf
);
basic_istream里面可是有一个指针的哦?

#14


还有
如果是
scanf("%d",&x);
scanf("%d",&y);中间就不需getchar()

#15


scanf("%d",&x);
scanf("%d",&y);你是取整数,回车是整数吗?再看看那句话吧。^_^

如果你把第二个改成取字符试试?

#16


说实话,我对这个东东也不熟悉,如果你要透彻了解的话,需要看汇编代码。
反者一句话,你输入了东东到缓冲区,不要指望一个scanf就能解决问题,即使是iostream。你有义务将缓冲区清空。其他的我也帮不了你了。^_^

#17


/* 以下代码在vc.net环境中编译、调试通过,并正常运行 */
/* Creamdog保留所有权力                             */
#include<stdio.h>
void main()
{
double c,f;
char an;
do
{
printf("enter the c: ");
scanf("%f",&c);
f=9.0/5*c+32;
printf("F=%f\n",f);
printf("do you want to use it again:(y/n) ");
scanf("%c",&an);
}while(an != 'n');

}

#18


#include<stdio.h>
void main()
{
double c,f;
char an;
do
{
printf("enter the c: ");
scanf("%f",&c);
f=9.0/5*c+32;
printf("F=%f\n",f);
printf("do you want to use it again:(y/n) ");
scanf("%c",&an);
                  printf("c=%d",an); //试试看,输出是10,表示换行^_^
}while(an != 'n');

}

#19


哇,你们想得出来呀,服了!!

#20


还有没有牛人来帮我?为什么buffer里面没有东东了?
explicit basic_istream(
   basic_streambuf<Elem, Tr> *_Strbuf
);
basic_istream里面可是有一个指针的哦?
有指针意味着什么?

#21


自已up

#1


C和C++对输入输出流的处理如何不同?

#2


printf("enter the c: ");
scanf("%f",&c);
getchar();//要多写一个来吃掉回车?
改为:
printf("enter the c: ");
scanf("%f",&c);
fflush(stdin);
清空输入缓冲区就行了。^_^

#3


cin为什么没有这回事?

#4


错了, CIN也会有这种错误, 只是你的编译器不是老式的, 所以就没有了.

流处理的时候不只是输入输出, 还有一个刷新的过程, 在C++里是flush, endl里面就含有这个函数.

#5


endl是输出的,输入的呢?

#6


在输入缓冲区里面取出一个字符,其实就是吃掉最后的回车符!

#7


自已up

#8


c的输入和输出是'字节流',输入和输出的数据流的开始和结束受程序控制而不受物理符号(如回车符换行符)的控制。所以你的键盘输入会全部记录到缓冲区,具体怎么取不同的函数处理方式不同。
你取数据的方式是float,所以那个结束符会一直留在输入缓冲区中。
而cin<<f;
用将输入定位到istream流,这次输入的东东已经在istream中了,输入缓冲区中已经没有了东东,所以...

#9


scanf("%c",&an); 你最后在取数据时用的类型是char,而回车就是一个char,所以scanf认为那个东东就是输入结束标志,所以....

#10


你取数据的方式是float,所以那个结束符会一直留在输入缓冲区中。?
我改成int也是这样的

#11


c的输入和输出是'字节流',输入和输出的数据流的开始和结束受程序控制而不受物理符号(如回车符换行符)的控制。所以你的键盘输入会全部记录到缓冲区,具体怎么取不同的函数处理方式不同。
再看看上面的东东,

#12


这次输入的东东已经在istream中了,输入缓冲区中已经没有了东东?
在http://expert.csdn.net/Expert/topic/2061/2061686.xml?temp=.1093408这个贴子里面
 xueweizhong(薛卫忠) 的回答里面
有这么几句话:
Enter a number: 1     \n<---按回车键
                    这时buffer = "1    \n";
cin >> n; 返回后-----> n = 1, buffer = "    \n";
buffer里面还有东东啊

#13


呵呵,可能我错了吧?^_^,那么他后来怎么回答了?
cin是什么,是std::basic_istream<char,std::char_traits<char>>
来自msdn:
explicit basic_istream(
   basic_streambuf<Elem, Tr> *_Strbuf
);
basic_istream里面可是有一个指针的哦?

#14


还有
如果是
scanf("%d",&x);
scanf("%d",&y);中间就不需getchar()

#15


scanf("%d",&x);
scanf("%d",&y);你是取整数,回车是整数吗?再看看那句话吧。^_^

如果你把第二个改成取字符试试?

#16


说实话,我对这个东东也不熟悉,如果你要透彻了解的话,需要看汇编代码。
反者一句话,你输入了东东到缓冲区,不要指望一个scanf就能解决问题,即使是iostream。你有义务将缓冲区清空。其他的我也帮不了你了。^_^

#17


/* 以下代码在vc.net环境中编译、调试通过,并正常运行 */
/* Creamdog保留所有权力                             */
#include<stdio.h>
void main()
{
double c,f;
char an;
do
{
printf("enter the c: ");
scanf("%f",&c);
f=9.0/5*c+32;
printf("F=%f\n",f);
printf("do you want to use it again:(y/n) ");
scanf("%c",&an);
}while(an != 'n');

}

#18


#include<stdio.h>
void main()
{
double c,f;
char an;
do
{
printf("enter the c: ");
scanf("%f",&c);
f=9.0/5*c+32;
printf("F=%f\n",f);
printf("do you want to use it again:(y/n) ");
scanf("%c",&an);
                  printf("c=%d",an); //试试看,输出是10,表示换行^_^
}while(an != 'n');

}

#19


哇,你们想得出来呀,服了!!

#20


还有没有牛人来帮我?为什么buffer里面没有东东了?
explicit basic_istream(
   basic_streambuf<Elem, Tr> *_Strbuf
);
basic_istream里面可是有一个指针的哦?
有指针意味着什么?

#21


自已up