我在下面的代码中遇到问题。如果用户输入多个字符,则我的循环执行的次数等于用户输入的字符串的长度。我的代码是用GNU c / c ++编译器编写的。
提前致谢。
int continue_option()
{
char c;
loop:
fflush(stdin);
cin.ignore();
cout<<"\n\n\t\t\t\tPress (Y/y) - Continue / Press (N/n) - Exit :";
cin>>c;
if(c=='y'||c=='Y')
{
system("clear");
}
else if(c=='n'|| c=='N')
{
exit(0);
}
else
{
printf("\n\t\t\t\tInvalid Option.Try Again.....");
goto loop;
}
fflush(stdin);
}
答案 0 :(得分:2)
首先,不要使用跳跃。他们是旧式的,除了所有其他不良后果之外,他们还让Dijkstra在他的坟墓中旋转。我的意思并不是“复古”,我的意思是老的意思。
截至你的问题,我宁愿把结果放在std :: string中,只考虑那里的第一个字符:
std::string input;
std::cin >> input;
switch (input[0]) {
case 'y':
case 'Y':
//your code
break;
case 'n':
case 'N':
exit(0);
default:
std::cout << "Invalid text" << std::endl;
}
我也不会使用exit(),我宁愿依赖函数的返回值来最终导致返回0;在main()或一些等效技术中。
答案 1 :(得分:1)
尝试使用cin.get()
或getch()
一次只读取一个字符。另外,我猜你最好用一个简单的循环代替整个事情:
char ch = '\0';
do
{
ch = getch();
}while((tolower(ch) != 'y') || (tolower(ch) != 'n'))
if(tolower(ch) == 'y')
{
//additional handling
}
else
{
exit(0);
}
答案 2 :(得分:1)
您无法阻止用户输入多个字符。
你可以做的是忽略剩余的一行。您已使用忽略一个字符的cin.ignore()
。您可以使用cin.ignore(large number)
忽略最大数字或行尾,以先出现者为准。
与刷新输出文件不同,fflush(stdin)
并没有真正做任何事情。
答案 3 :(得分:0)
不完全相同的行为,但应该让你走上正轨:
#include <iostream>
#include <iomanip>
bool is_valid_answer(char c)
{
switch(c)
{
case 'y':
case 'Y':
case 'n':
case 'N':
return true;
default:
return false;
}
}
bool continue_option()
{
std::cout << "Press (Y/y) to continue, (N/n) to exit: " << std::flush;
char c = '\0';
while (std::cin.get(c) && !is_valid_answer(c));
return ((c == 'y') || (c == 'Y'));
}
int main()
{
std::cout << "Continue option: " << continue_option() << std::endl;
}