【问题标题】:C getchar loop to get integer input from user - [how to improve]C getchar 循环从用户获取整数输入 - [如何改进]
【发布时间】:2022-08-04 08:07:33
【问题描述】:

有没有更优雅的方式来完成这项任务?

程序要求用户输入整数并在输入非数字字符时重复。 退出循环需要两个条件: a) 所有输入的字符都是数字 b) 最后一个字符是 \'\\n\'

像 scanf 这样的短解决方案不能正常工作,其他方法需要大量的变量循环和 if else 条件。用户输入是常见任务,我希望有适当的可重用模板。

主观意见表示赞赏。简化此功能的方法或对另一种解决方案的建议。改进格式。阅读以获得更系统的理解。

#include <stdio.h>

int getIntOnly();

int main() {
    int x = 0;
    x = getIntOnly();
    printf(\"\\nvalue entered is: %d \\n\", x);
}

int getIntOnly() {
    int ch, num, quit, abc;

    do {
        num = 0;
        ch = 0;
        quit = 0;
        abc = 0;
        printf(\"Enter the input: \");

        do {
            ch = getchar();
            if (ch >= 48 && ch <= 57) {
                num = num * 10 + (ch - 48);
            }
            else if (ch == \'\\n\') {
                quit = 1;
            }
            else {
                abc = 1;
            }

        }
        while (quit == 0);

    }
    while (quit == 0 || abc == 1);
    return (num);
}
  • 阅读带有fgets() 的行。然后您可以使用strtol() 将其解析为数字。
  • 对于更复杂的输入:对于命令行处理,通常最好指定参数而不是交互,(GNU getopt)。对于用户输入很常见的情况,通常您也会使用终端 API (ncurses)。如果要解析输入,请考虑使用lex等人(re2c) 可能还有yacc/bison/lemon
  • 不要硬编码4857,使用\'0\'\'9\'。但也不要这样做;使用isdigit
  • YukaMax,你想防止溢出吗?前导符号 + 或 - 怎么样?
  • chux - 恢复 Monica,任务只是获得正数,但为 + 和 - 构建相同的程序很有趣。防止溢出更好。

标签: c loops input getchar


【解决方案1】:

使用fgets() 意味着您将立即获得全文。 然后,您可以检查它(也可以转换它)以满足您的需要。

int getIntOnly( void ) {
    int value = 0, i = 0;
    char buf[ 64 ];

    do {
        printf( "Enter integer value: " );

        
        fgets( buf, sizeof( buf ), stdin );
        
        value = 0;
        for( i = 0; '0' <= buf[i] && buf[i] <= '9'; i++ )
            value = value * 10 + buf[i] - '0';

    } while( buf[i] != '\n' ); // good! reached end of line

    return value;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2018-09-21
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多