首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C编程ncurses输入验证

C编程ncurses输入验证
EN

Stack Overflow用户
提问于 2015-09-02 15:28:35
回答 1查看 651关注 0票数 0

我正在使用ncurses和C编写一个小项目,我遇到了两个问题,它们是关于验证输入的。例如,案例1:我想验证输入是一个指定的特定字符,例如:a、b或c。

代码语言:javascript
复制
char choice;
printw("a. New name\n");
printw("b. Edit name\n");
printw("c. Exit\n");

scanw("%c", &choice);

if (choice == 'a')
    //Do something
else if(choice =='b') {
   //Do something
}
else if(choice == 'c') {
    exit(0);
}    

案例2:我只想在整数范围内验证输入,例如:1到5。

代码语言:javascript
复制
int player_number
printw("How many players ? (1 - 5): ");
scanw("%i", &player_number);    

具有讽刺意味的是,我可以在ncurse上下文之外找到这两个问题的解决方案。此外,我怎样才能退出我的程序与按键,如'q‘,每当它提示用户输入。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 08:29:35

你可以试试这样的东西。

代码语言:javascript
复制
#include <ncurses.h>

int main()
{
    char choice = 0;
    int player_number = -1;

    initscr ( );
    do {
        mvprintw ( 1, 1,"a. New name");
        mvprintw ( 2, 1,"b. Input number");
        mvprintw ( 3, 1,"c. Exit");
        mvprintw ( 4, 1," ");
        if (( scanw("%c", &choice)) == 1) {//scanw succeeded
            if ( ! ( choice == 'a' || choice == 'b' || choice == 'c')) {
                mvprintw ( 5, 1,"invalid input, should be a, b or c");
            }
            else {
                mvprintw ( 5, 1,"                                  ");
            }
        }
    } while ( ! ( choice == 'c' || choice == 'b'));
    mvprintw ( 5, 1,"                                  ");
    if ( choice == 'b') {
        do {
            mvprintw ( 7, 1,"Enter number 0-9");
            mvprintw ( 8, 1," ");
            if (( scanw("%d", &player_number)) == 1) {//scanw succeeded
                if ( player_number < 0 || player_number > 9) {
                    mvprintw ( 9, 1,"invalid input, should be 0-9");
                }
            }
            else {//scanw failed
                mvprintw ( 9, 1,"invalid input, should be 0-9");
            }
        } while ( player_number < 0 || player_number > 9);

    }
    endwin ( );
    return 0;
}

使用char数组包含输入,使用getnstr()读取输入,就可以检测到q的输入以退出程序。对于数字输入,strtol()用于将数组转换为int。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>

int main()
{
    char choice = 0;
    char instr[128] = {0};
    int player_number = -1;

    initscr ( );
    do {
        mvprintw ( 1, 1,"a. New name");
        mvprintw ( 2, 1,"b. Input number");
        mvprintw ( 3, 1,"c. Exit");
        mvprintw ( 4, 1," ");
        if (( getnstr( instr, 1)) != ERR) {//succeeded
            choice = instr[0];
            if ( ! ( choice == 'a' || choice == 'b' || choice == 'c')) {
                mvprintw ( 5, 1,"invalid input, should be a, b or c");
                if ( choice == 'q') {//quit when q is entered
                    endwin ( );
                    return 0;
                }
            }
            else {
                mvprintw ( 5, 1,"                                  ");
            }
        }
    } while ( ! ( choice == 'c' || choice == 'b'));
    mvprintw ( 5, 1,"                                  ");
    if ( choice == 'b') {
        do {
            mvprintw ( 7, 1,"Enter number 0-9");
            mvprintw ( 8, 1," ");
            if (( getnstr( instr, sizeof ( instr))) != ERR) {//succeeded
                if ( instr[0] == 'q' && instr[1] == '\0') {//quit when q is entered
                    endwin ( );
                    return 0;
                }
                player_number = strtol ( instr, NULL, 10);
                if ( player_number < 0 || player_number > 9) {
                    mvprintw ( 9, 1,"invalid input, should be 0-9");
                }
            }
            else {//failed
                mvprintw ( 9, 1,"invalid input, should be 0-9");
            }
        } while ( player_number < 0 || player_number > 9);
    }
    endwin ( );
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32357244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档