Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;isalnum无限循环_C++_Isnumeric - Fatal编程技术网

C++ c++;isalnum无限循环

C++ c++;isalnum无限循环,c++,isnumeric,C++,Isnumeric,你好 这次让我们把过多的介绍删去,直截了当地说吧 我在C++中使用ISALNUM方法有问题。< /P> 守则: int playAgainst = 0; do { cout << "Who do you want to play against?(1/2)\n"; cout << "1: Human player\n"; cout << "2: Computer player\n"; cin >> playAgain

你好

这次让我们把过多的介绍删去,直截了当地说吧

<>我在C++中使用ISALNUM方法有问题。< /P> 守则:

int playAgainst = 0;
do
{
    cout << "Who do you want to play against?(1/2)\n";
    cout << "1: Human player\n";
    cout << "2: Computer player\n";
    cin >> playAgainst
} while(!isalnum(playAgainst) && playAgainst != 0);
int-play对抗=0;
做
{

不能制作
游戏
字符
并与
'0'
而不是
0
进行比较。现在,用户必须输入字符
'1'
'2'
的ASCII码(或任何字符集)

<代码> iSalnUn>代码>在cho> <代码>有效范围之外,不适用于<代码> int >代码>,除了<代码> int >代码>参数外,它是C的剩余部分,它具有不同的整数升迁规则,而不是C++。
check.
cin>>playdainst
会将数字以外的任何内容转换为零,这将被第二次检查捕获。请注意,这只是一个选项,因为零不是有效的输入


isalnum()

int isalnum (int ch)
{
  return (ch >= 'a' && ch <= 'z') || 
         (ch >= 'A' && ch <= 'Z') || 
         (ch >= '0' && ch <= '9');
}
int-isalnum(int-ch)
{

return(ch>='a'&&ch='a'&&ch='0'&&ch这是因为您没有清除缓冲区。当输入无效时,您需要从缓冲区中清除它,然后您可以转到下一个输入,否则每次都试图提取相同的输入(失败,因为它是相同的错误输入),从而进入一个无限循环。

问题是您输入的是int,而不是char 输入中的文本不是int,则输入失败。在这种情况下, 对战不修改,失败记录在
std::cin
直到您明确清除错误。并且从 错误状态是不可操作的。您可能要做的是

  • 输入单个字符:如果不想跳过空格,请使用 `std::cin.get(ch)`或`ch=std::cin.get()`(在后者中) 大小写'ch'应该是'int',因为它还必须处理'EOF'。 另一方面,您可以直接在其上使用`::isalnum` 如果'ch'是'char',则不能这样做
  • 完全检查有效输入:不仅仅是“::isalnum”,而是 输入是否是列表中的合法选择器 大致如下: ch != EOF && std::find( legalChars.begin(), legalChars.end(), (char)ch ) != legalChars.end() 然后在这些表上循环以输出提示,并将其搜索到 查看角色是否合法,最后,在 或者定义一个抽象基类,一个具体的类 从每个命令派生它,并使用<代码> STD::MAP< /COD>用于映射等非常C++,但可能有点
    对于这样一个简单的例子来说,太夸张了。

    @Acme不确定,但是无论我是否更改它,生成的结果都是完全相同的,虽然我知道区别,但我可能应该使用isdigit,因为我不需要检查上/下case@JoeyRoosing::只需使用
    isdigit()
    要确保它是一个数字,然后根据循环的工作方式测试
    2
    。并确保不会混淆数值和字符值;要使用
    isdigit()
    ,您必须读取一个字符而不是整数,并与
    '1'
    '2'
    @Acme:I进行比较。然而,这并不能解决我的问题。因为在代码示例中,我使用了cin>>PlayAgain,它确定PlayAgain的值,然后才能进行检查,因为isdigit(cin>>PlayAgain)将产生一个错误。它将无休止地循环,因为假定为int的值不是int@Mike西摩:谢谢。这的确是一个合乎逻辑的答案!我想拥有一个字符是我真正想要实现的唯一解决方案。谢谢:)还有Acme!而(季后赛!='1'| |季后赛!='2')这是可行的。虽然这不是我所希望的。(例如C#-er:P)谢谢!但我担心的是,如果我再增加800个选项(小说…)我必须编写大量的| |运算。在这种情况下,检查值是否为数字,并且无论如何都无法将800个值放入典型的
    字符中。如果确实需要
    int
    ,那么
    isalnum
    是没有用的。
    cin>>如果不输入有效的整数,我将失败。这是一个虚构的问题,可能有点愚蠢的一个。这正是我所担心的问题。这个值必须是int。可以尝试一个try-catch块来解决这个问题。@Joey实际上这就是isalnum所做的。它只是检查ASCII值是否在一定的间隔a-z或a-z或0-9内。就是这样,没有什么奇妙的魔力。@larsmans isalnum接受int的事实并不是一个简单的问题C语言的剩余部分(除非所有的都是C语言的剩余部分)。isalnum接受一个int,这样它就可以接受EOF和一个字符(EOF返回false)另外,C和C++的整数提升规则完全相同。也许你在想“0”是C中的int,但是C++中的字符。这并不能真正回答问题:为什么在这个情况下,<代码> iAlnNu<代码>工作?谢谢你澄清ISalnUm是如何被整数化的。总是有用的知道。但是Mike Seymour是RIG。好的。但那很好。我从所有答案的组合中学到了很多!谢谢。事实上,它没有回答这个问题,尽管它与澄清相关。如果评论没有劣等的代码格式选项,我会将其作为评论发布。所以怪责So网站。我还没有看到使用该解决方案的库。从历史上看,isalnum was是一个宏,它只引用了它的参数一次!=0
    @James讽刺的是,这实际上直接取自嵌入式系统编译器的源代码。也许他们依靠自己的优化器使代码变得更漂亮。或者更可能的是,他们只是不想分配查找表。实际上我怀疑 std::cin.ignore(INT_MAX, '\n');
    struct Command
    {
        char        op;
        char const* prompt;
        void (*     func)();
    };