如何防止用户在下面的示例代码中输入多个字符?

时间:2011-06-03 12:36:19

标签: c++

我在下面的代码中遇到问题。如果用户输入多个字符,则我的循环执行的次数等于用户输入的字符串的长度。我的代码是用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);
}

4 个答案:

答案 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;
}