注册 登录
编程论坛 C++教室

[求助]怎么退出这个循环?

jiaju111 发布于 2007-05-09 15:51, 1500 次点击
大家帮我看看这个程序怎么退出循环,谢谢了

我在VC6.0里面退不出来,按Ctrl+Z也不好使,怎么回事啊??

#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
while(getline(cin,s))
cout<<s<<endl;
return 0;
}
16 回复
#2
BlueDreame2007-05-09 16:13

不太清楚,我觉得可能是VC 6不严格遵守标准的原因,有些书上的例子根本运行不对。

#3
I喜欢c2007-05-09 16:19
敲两次回车就结束了吧~``
#4
raulxxyuer2007-05-09 16:19

getline(),其原型:istream &getline(char *buf,int num,char delim='\n';)
它从输入流中读取字符到buf所指的数组中,直到读满num个字符或遇到delim所指的字符为止.

#5
jiaju1112007-05-09 16:35

那应该用什么编译器比较标准?

敲两次回车也不行,退不出循环,如果没有循环的话,敲两次回车可以正常运行getline()函数

到底是什么原因呢?

#6
jiaju1112007-05-09 18:28

不行吧?
你给的第一个等价于
int main()
{
string s;
getline(cin,s);
cout<<s<<endl;
return 0;
}
第二个等价于
int main()
{
string s;
cin>>s;
cout<<s<<endl;
return 0;
}

[此贴子已经被作者于2007-5-9 18:28:52编辑过]

#7
aipb20072007-05-09 19:33

ctrl+z 回车
再ctrl+z 回车


退出

#8
weishj2007-05-09 20:15
我想楼主的意思是想知道退出这个循环的条件,而不是说怎么操作才能让它退出.
getline函数返回的值可能是个指针,我用下面程序测试一下:
#include <iostream>
#include <string>
using namespace std;
void main()
{
string s;
cout<<getline(cin,s)<<endl;
cout<<s<<endl;
}
当随便输入一个字符串时,先输出一个八位十六进制数字,这个数字不为零,所以LZ的循环退不出.
至于这个十六进制代表什么,请高人帮我一下.
刚才说错一点,getline不是string中的但此处其原型应该是
template<class E, class T, class A>
basic_istream<E, T>& getline(
basic_istream <E, T>& is,
basic_string<E, T, A>& str);

[此贴子已经被作者于2007-5-9 20:32:10编辑过]

#9
jiaju1112007-05-09 22:00
谢谢大家的回复!

谢谢大家的回复

9楼的可以说说为什么需要两次ctrl+z吗?(而且还得两次ctrl+z回车操作相邻才行?)

[此贴子已经被作者于2007-5-9 22:05:21编辑过]

#10
aipb20072007-05-10 09:06
以下是引用jiaju111在2007-5-9 22:00:12的发言:

谢谢大家的回复

9楼的可以说说为什么需要两次ctrl+z吗?(而且还得两次ctrl+z回车操作相邻才行?)


我是这样理解的,但是不知道对不对。

因为是提取string的值,所以ctrl+z会被首先判断为字符串,再加上一个ctrl+z就可以表示想输入的确实是文件终止符。纯属猜想,呵呵。

#11
jiaju1112007-05-10 10:24

我也是这么想的

谢谢啦

#12
weishj2007-05-10 10:37

我感觉讨论如何操作才能退出这个循环应该不在编程的范畴了吧.LZ要真想要退出这个循环的操作方法,除按两次Ctrl+Z外,还有以下方法
1.Ctrl+Pause Break
2.Alt+F4
3.点击关闭按钮
4.结束进程
5.重启计算机
其效果跟按两次Ctrl+z等价
但要是这样的话该贴似乎不应该出现在编程论坛
LZ写那个程序的本意貌似一直让用户输入字符串,并显示在屏幕上,直到输入的为空字符串为止退出循环
但getline函数好象不返回0值或者bool false,所以我感觉研究一下getline比讨论如何操作来退出循环意义要大的多
连按两次Ctrl+z的效果跟七楼的程序差不多吧.
与其连按两次Ctrl+z,倒还不如这样
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int n,i=0;
cout<<"想输入几次:"<<endl;
cin>>n;
while(i<n)
{
cin>>s;
cout<<s<<endl;
i++;
}
return 0;
}

#13
yuyunliuhen2007-05-10 12:55

ctrl+z 回车就可以退出来了吧 (VC++2005下)
如LS所说,研究一下getline比讨论如何操作来退出循环意义要大的多,要退出程序有很多的方法。

我们可以不用全局名称空间,下个程序可以参考一下
#include <string>
#include <iostream>
int main () {
std::string s,s2;
std::getline(std::cin,s);
std::getline(std::cin,s2);
std::cout << s <<'\t'<< s2 << std::endl;
return 0;
}

#14
yuyunliuhen2007-05-10 13:10

在不同的编译下结果会有点区别:
VC++6.0:
INPUT:
Hello enter
World enter
Why? enter
OUTPUT:
Hello World //Why?被丢弃了

VC++2005:
input:
Hello enter
World enter

OUTPUT:
Hello World 不知道这是不是VC++6.0的一个BUG。

下面为MSDN的资料:
getline
Parameters
_Istr
The input stream from which a string is to be extracted.

_Str
The string into which are read the characters from the input stream.

_Delim
The line delimiter.

Return Value
The first function returns getline( _Istr, _Str, _Istr.widen( '\n' ) ).

The second function replaces the sequence controlled by _Str with a sequence of elements extracted from the stream _Istr.

Remarks
In order of testing, extraction stops:

At end of file.

After the function extracts an element that compares equal to delim, in which case the element is neither put back nor appended to the controlled sequence.

After the function extracts str.max_size elements, in which case the function calls setstate(ios_base::failbit).

If the function extracts no elements, it calls setstate(failbit). In any case, it returns _Istr.



#15
jiaju1112007-05-11 18:27
可能是VC6.0的BUG吧

正常的话应该用文件结束符Ctrl+z 就能结束程序
1