如何限制用户输入

路加

我一直在创建一个程序,要求用户输入一个char值,但是如果他们输入多个字符,它将移至下一个函数并中断程序。我添加了第二种方法,当输入多个输入时该方法将运行。

克利福德

您的问题不是限制写入的字符数之一cInput格式说明符%1s已经做到了。您的问题是在输入缓冲区中留下未处理的字符之一。如果后续输入无法处理它们,则需要从缓冲区中删除所有字符。例如,如果您将一个字母字符保留在then缓冲区中,但稍后使用读取%d,该函数将立即返回(因为还隐含了一个换行符),但是该字符将保持缓冲状态,因为它不是十进制数。如果您从不清除缓冲区,此操作将无限期继续。

对于单个字符,可以检查该字符不是换行符,然后重复获取字符直到找到换行符,如下所示:

scanf("%c", &cInput ) ;
while( cInout != '\n' && getchar() != '\n' ) { } // flush buffered line

如果要确保用户只输入一个字符,则可以这样修改上面的内容:

scanf("%c", &cInput ) ;   // Get a single character

if( cInput != '\n' &&     // If the input is not "empty",
    getchar() != '\n' )   // but the first character entered was not
                          // immediately followed by a newline...
{
    // Flush to the end of the entered line
    while( getchar() != '\n' ) { }

    // Invalidate the input to force retry
    cInput = 0 ;
}

至少要缓冲一个字符-至少要换行一个有效的答案将包含两个字符,其中一个cInput和一个换行符if(...)上面条件读取第二个字符(如果有)(使用的短路评估cInput),并检查它是否是输入的结尾(换行符)。如果不是,它将读取所有缓冲的字符,然后使其无效cInput"No-way\n"例如,假设输入了该字符,则cinput包含)'N'

对于数字输入,您只需读取字符,直到找到换行符:

scanf("%d", &nValue);
while( getchar() != '\n' ) { } // flush buffered line 

如果结尾的非数字字符会使整个输入无效,则需要检查以下字符是否为换行符。

int converted = scanf("%d", &nValue);
if( converted == 0 || getchar() != '\n' )
{
    valid_input = false ;
    while( getchar() != '\n' ) { } // flush buffered line 
}

请注意,还有其他可能的解决方案。这是我的首选解决方案。

当应用于您的函数(具有其他简化形式)时:

int intAskUser(void)
{
    char cInput = 0 ;

    while( cInput != 'N' && cInput != 'Y' )
    {
        printf("Do you want to enter a value? Y or N\n");
        scanf("%c", &cInput ) ;
        if( cInput != '\n' && getchar() != '\n' )
        {
            while( getchar() != '\n' ) { } // flush buffered line
            cInput = 0 ;
        }
        else
        {
            cInput = toupper(cInput) ;
        }
    }

    // Return answer code 0 to 1
    return (cInput == 'N') ? 0 : 1 ;
}

int getValue(int nLower, int nUpper)
{
    assert( nLower < nUpper ) ;  // precondition check

    int nValue = 0 ; 
    bool valid_input = false ;

    while( !valid_input )
    {
        printf("Enter a value between %d and %d: ", nLower, nUpper ) ;
        int converted = scanf("%d", &nValue);
        if( converted == 0 || getchar() != '\n' )
        {
            valid_input = false ;
            while( getchar() != '\n' ) { } // flush buffered line 
        }

        valid_input = nValue >= nLower && 
                      nValue <= nUpper ;

        if( !valid_input )
        {
            printf( "Please try again. " );
        }
    } 

    printf("Value: %d", nValue);
    return nValue;
}

需要注意的是toupper()需要ctype.h被收录,并类型bool需要stdbool.h

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何限制用户整数输入?

来自分类Dev

如何限制用户仅在输入字段中输入数字?

来自分类Dev

Android限制用户输入

来自分类Dev

限制用户输入

来自分类Dev

如何设置用户在C语言中输入字符的时间限制?

来自分类Dev

如何限制用户在Webview,Android中输入值?

来自分类Dev

用户多次输入错误模式时如何设置限制?

来自分类Dev

如何限制用户在单列中仅输入“Y”或“N”

来自分类Dev

设置用户输入的时间限制

来自分类Dev

Bash脚本。限制用户输入

来自分类Dev

在 Sting 中限制用户输入

来自分类Dev

如何限制触摸输入?

来自分类Dev

如何限制用户在输入元素中输入10位数字?

来自分类Dev

如何限制输入的小数位数,直到用户可以输入值?

来自分类Dev

如何将用户的输入限制为仅在 C++ 中输入数字和字母

来自分类Dev

如何限制某人在用户名字段中输入特定的用户名?

来自分类Dev

用户输入的Python安全性限制

来自分类Dev

限制用户输入php URL的过程

来自分类Dev

将用户输入限制为64位?

来自分类Dev

将用户输入限制为64位?

来自分类Dev

使用数据注释限制用户输入

来自分类常见问题

如何更改Shiny中的“超出最大上传大小”限制并保存用户文件输入?

来自分类Dev

如何限制用户在文本区域仅输入250个单词?

来自分类Dev

如何在DataGridView中将用户输入限制为几个值

来自分类Dev

如何限制用户在SWT文本字段中输入特殊字符

来自分类Dev

如何限制用户扫描仪输入数据类型(java)?

来自分类Dev

如何限制用户输入的字符串的大小或动态分配内存

来自分类Dev

如何将用户输入限制为已存储为变量的特定字符串?

来自分类Dev

如何限制用户仅输入12小时的时间(上午和下午)

Related 相关文章

  1. 1

    如何限制用户整数输入?

  2. 2

    如何限制用户仅在输入字段中输入数字?

  3. 3

    Android限制用户输入

  4. 4

    限制用户输入

  5. 5

    如何设置用户在C语言中输入字符的时间限制?

  6. 6

    如何限制用户在Webview,Android中输入值?

  7. 7

    用户多次输入错误模式时如何设置限制?

  8. 8

    如何限制用户在单列中仅输入“Y”或“N”

  9. 9

    设置用户输入的时间限制

  10. 10

    Bash脚本。限制用户输入

  11. 11

    在 Sting 中限制用户输入

  12. 12

    如何限制触摸输入?

  13. 13

    如何限制用户在输入元素中输入10位数字?

  14. 14

    如何限制输入的小数位数,直到用户可以输入值?

  15. 15

    如何将用户的输入限制为仅在 C++ 中输入数字和字母

  16. 16

    如何限制某人在用户名字段中输入特定的用户名?

  17. 17

    用户输入的Python安全性限制

  18. 18

    限制用户输入php URL的过程

  19. 19

    将用户输入限制为64位?

  20. 20

    将用户输入限制为64位?

  21. 21

    使用数据注释限制用户输入

  22. 22

    如何更改Shiny中的“超出最大上传大小”限制并保存用户文件输入?

  23. 23

    如何限制用户在文本区域仅输入250个单词?

  24. 24

    如何在DataGridView中将用户输入限制为几个值

  25. 25

    如何限制用户在SWT文本字段中输入特殊字符

  26. 26

    如何限制用户扫描仪输入数据类型(java)?

  27. 27

    如何限制用户输入的字符串的大小或动态分配内存

  28. 28

    如何将用户输入限制为已存储为变量的特定字符串?

  29. 29

    如何限制用户仅输入12小时的时间(上午和下午)

热门标签

归档