c - 在 C 中使用 union 的 switch 语句给我带来了问题,我的代码出了什么问题?

标签 c switch-statement unions

我几乎完成了我的任务,我应该构建一个程序,用户可以在其中与仓库程序交互,您可以在其中删除、添加、编辑...但是在我的 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 的是 toupperconvert_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/

相关文章:

c - 用C中的空格分割每一行

c - 如何在c中调整Linux应用程序中xterm的字体颜色

c - C(Windows) 中 printf(0) 的安全隐患

c++ - 错误 C2360 : Initialization of 'hdc' is skipped by 'case' label

c# - 为什么 C# switch 语句不允许使用 typeof/GetType()?

c++ - 特殊结构 : grouping of (pointers to function and groupings of pointers to function)

c - memcpy to union 没有按预期工作

c - 如何在mac m1(苹果硅)上安装GDB?

c# - 在 foreach 循环内的开关嵌套中使用 `continue` 关键字

c# - 将 C++ 结构体 union 转换为 C#