微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ncurses表单中的字段验证存在问题

如何解决Ncurses表单中的字段验证存在问题

我在以ncurses形式进行字段验证时遇到了一些问题,希望有人对此有所解释。 问题在于下面的附加代码。特别是在函数validateField()中名为“ AuthorityCode”的字段中。 ENUM Auth_codes设置为三个值,并且在输入正确的值(其中一个枚举值)时可以正常工作。它还会验证大多数不正确的值(不在ENUM中的值)。但是,由于某种原因,它在字段中接受单个数字“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”或“ 8”,但不接受“ 7”或“ 9” '。似乎没有一个字母被接受,也没有一个以上数字的组合,只有上述数字。 其他所有验证(包括其他枚举)似乎都可以正常工作。

是否有人对此行为有解释,或者可以在我的代码中找到问题?

const char* Auth_codes[]
{ "Add","Update","Delete" };

const char* Return_codes[]
{ "Accepted","Denied" };

const char* Priorities[]
{ "3","5","6","8" };


void createForm(WINDOW *win_body,vector<string> &input,int selection)
{
    int rows;
    int cols;
    int i;
    int cury = 0;
    int curx = 1;
    int nb_fields;
    WINDOW *inner;

    formClose = false;

    getmaxyx(win_body,rows,cols);

    nb_fields = input.size()
    
    fields = (FIELD**) malloc(sizeof(FIELD *) * (nb_fields + 1));
    assert(fields);

    for (i = 0; i < nb_fields; i++)
    {
            fields[i] = new_field(1,10,cury,curx,0);
            assert(fields[i] != NULL);
            set_field_buffer(fields[i],"");
            field_opts_on(fields[i],O_ACTIVE);
            field_opts_on(fields[i],O_EDIT);
            field_opts_off(fields[i],O_AUTOSKIP);
            set_field_back(fields[i],A_UNDERLINE);
            validateField(fields[i],input[i].c_str()); // Set correct field validation based on label value
            curx = 1; // Set position for next label field
            cury = cury + 1; // Next line

    }
    
    fields[i] = NULL;
    form = new_form(fields);
    assert(form != NULL);
    win_form = derwin(win_body,rows - 10,cols - 4,3,2);
    Box(win_form,0);
    assert(form != NULL && win_form != NULL);
    set_form_win(form,win_form);
    inner = derwin(win_form,form->rows + 1,form->cols + 1,1,1);
    assert(inner != NULL);
    set_form_sub(form,inner);

    assert(post_form(form) == E_OK);
    assert(post_menu(menu) == E_OK);

    refresh();
    wrefresh(win_body);
    wrefresh(win_form);

    while (formClose == false)
        process_input(getch());

    delete_form();

}


void validateField(FIELD *field,const char *name)
{
    if (strcmp(name,"AdviceNoteNumber") == 0)
    {
        set_field_type(field,// Field to alter
                TYPE_ALNUM,// Type to associate
                0);             // Minimum field width
    }
    else if (strcmp(name,"AssignmentId") == 0 || strcmp(name,"AssignmentReferenceId") == 0
            || strcmp(name,"TransportAssignmentId") == 0)
    {
        set_field_type(field,// Field to alter
                TYPE_INTEGER,// Type to associate
                0,// Number of padding zeroes
                10000,// Min value
                99999);         // Max value
    }
    else if (strcmp(name,"AuthorityCode") == 0)
    {
        set_field_type(field,// Field to alter
                TYPE_ENUM,// Type to associate
                Auth_codes,// List of values
                0,// Not case sensitive
                1);             // Unique prefix
    }
    else if (strcmp(name,"ReturnCode") == 0)
    {
        set_field_type(field,// Type to associate
                Return_codes,// Not case sensitive
                1);             // Unique prefix

    }
    else if (strcmp(name,"Priority") == 0)
    {
        set_field_type(field,// Type to associate
                Priorities,// Not case sensitive
                1);             // Unique prefix
    }

解决方法

 set_field_type(field,// Field to alter
            TYPE_ENUM,// Type to associate
            Priorities,// List of values
            0,1);             // Unique prefix

set_field_type的第三个参数是可接受的枚举值列表,指定为char **

那不能是一些未指定大小的指针的列表。显然,必须以某种形式或方式定义可接受的枚举值的数量(此处为指针的数量)。 set_field_type文档中没有明确指出如何定义可接受的枚举值的 number ,这只是一个char **参数。但是,在C和C ++中,假定指针列表以NULL指针终止是一种公认​​的做法。教科书中NULL指针的含义的典型定义的一部分在某种程度上落入了这些界限之内。 set_field_type的文档暗示了这一点。

const char* Priorities[]=
{ "3","5","6","8" };

该参数是四个char *的列表,该列表按原样传递。当它变成set_field_type时,它只是一些char **的值。这里没有任何东西明确地将其定义为四个指针,因此set_field_type试图找出有多少枚举值,开始在这里查找,计算四个指针,然后继续计数,然后计数,向前进入随机内存,尝试将每个值依次解释为一个char *,直到在某个地方遇到它认为是NULL的值,同时尝试将每个中间值解释为char *,指向某个地方。

如果现在还没有崩溃,它将开始看到幻像有效的枚举值,并导致demons flying out of your nose

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。