我几乎完成了我的任务,我应该构建一个程序,用户可以在其中与仓库程序交互,您可以在其中删除、添加、编辑...但是在我的 event_loop
函数中,无论我输入什么内容从菜单中选择,都会在我的 switch 语句中默认。我在我的ask_question_menu中使用了uniontype的answer_t,所以也许它与我想要成为单个字符的函数的返回有关。谁能告诉我这到底是怎么回事?
非常感谢您的帮助!
typedef union {
int i;
float f;
char *s;
char d;
} answer_t;
char ask_question_menu(char *question){
answer_t answer = ask_question(question, correct_input, (convert_func) toupper);
return answer.d;
}
//my general function for user input follows here...
answer_t ask_question(char *question, check_func check, convert_func convert)
{
int buffersize = 50;
char buffer[buffersize];
do
{
printf("%s\n", question);
read_string(buffer, buffersize);
}
while(check(buffer)==false);
answer_t result = convert(buffer);
return result;
}
int event_loop(item_t *db, int *db_size)
{
while(true){
char choise = ask_question_menu(" [L]ägga till en vara\n [T]a bort en vara\n [R]edigera en vara\n Ån[g]ra senaste ändringen\n Lista [h]ela varukatalogen\n [A]vsluta\n");
switch(choise)
{
case 'L':
add_item_to_db(db, db_size);
break;
case 'T':
remove_item_from_db(db, db_size);
break;
case 'R':
edit_db(db, *db_size);
break;
case 'G':
printf("Not yet implemented\n");
break;
case 'H':
list_db(db, *db_size);
case 'A':
return 0;
break;
default:
printf("Wrong input\n");
break;
}
}
}
最佳答案
当convert
指向toupper()
时,这一行...
answer_t result = convert(buffer);
...肯定会产生未定义的行为,因为 toupper()
接受一个 int
类型的参数并返回一个 int
,但你是传递 char *
并假设返回值是 answer_t
。如果您愿意,您可以说最终负责此 UB 的是 toupper
到 convert_func
的转换。
如果您需要一个返回 answer_t
的函数,那么您需要包装 toupper()
。目前还不清楚 convert_func
应该具有什么形式,但这与您尝试使用它的方式兼容:
answer_t toupper_wrap(char *buffer) {
return (answer_t) { .d = toupper(*buffer) };
}
传递一个指向它的指针,而不是直接传递到toupper()
的指针。
关于c - 在 C 中使用 union 的 switch 语句给我带来了问题,我的代码出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39626730/