如果要在代码块(c ++)中按Enter,我想退出循环。 这是我的代码
{{1}}
答案 0 :(得分:1)
当您仅使用getline()
或简单地使用std::cin()
来获取整个字符串时,我不知道为什么这很重要,但是在这里:
#include <iostream>
#include <cstring>
#include <string>
int main(int argc, char const *argv[]) {
std::string s = "";
std::string ch;
while(true) {
std::cout << ">>> ";
getline(std::cin, ch);
if(ch.empty()) break;
s += ch;
}
std::cout << s << std::endl;
return 0;
}
答案 1 :(得分:0)
在您的用例中,cin
存在一个普遍问题! cin总是被缓冲,因为如果按下“ enter”,控制台只会将输入传递给程序。因此,您无法直接看到字符。如果要从用户那里获取单个字符作为类型,则必须关闭控制台缓冲。这不是便携式的!我的解决方案仅适用于posix。 (示例的第一部分)如果不需要立即获取字符,则不需要切换缓冲,但是在这种情况下,对输入的单个字符运行自己的循环确实没有任何意义。
要摆脱循环,您只需使用break
语句,请参见下面的代码。
但是,与单个字符值进行比较也不是可移植的,因为如果按下回车键,系统会给您CR
或CRLF
两个字符。
void IoBufferOff()
{
struct termios t;
tcgetattr(STDIN_FILENO, &t); //get the current terminal I/O structure
t.c_lflag &= ~ICANON; //Manipulate the flag bits to do what you want it to do
tcsetattr(STDIN_FILENO, TCSANOW, &t); //Apply the new settings
}
int main()
{
IoBufferOff();
std::string s="";
char ch;
while(1)
{
std::cin.get(ch);
if ( ch == 0x0a ) break;
s+=ch;
}
std::cout << s << std::endl;
return 0;
}
如果您只想从控制台读取一行,如果在按下Enter键时应该读取该行,则应使用getline
而不是使用自己的非便携式解决方案!
int main()
{
std::string s="";
std::getline( std::cin, s );
std::cout << s << std::endl;
return 0;
}