gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:27:11 25 4
gpt4 key购买 nike

我在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, 0);
assert(fields[i] != NULL);
set_field_buffer(fields[i], 0, "");
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, 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, // Field to alter
TYPE_ENUM, // Type to associate
Return_codes, // List of values
0, // Not case sensitive
1); // Unique prefix

}
else if (strcmp(name, "Priority") == 0)
{
set_field_type(field, // Field to alter
TYPE_ENUM, // Type to associate
Priorities, // List of values
0, // 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的文档中没有明确指出如何定义可接受的枚举值的 数字,这只是 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

关于c++ - Ncurses表单中的字段验证存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63882816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com