C语言编译报错:type specifier missing,如何修复?
快餐车计价程序编译错误修复
编译错误信息
fatal error: too many errors emitted, stopping now [-ferror-limit=] 2 errors generated. make: *** [<builtin>: snackbar] Error 1 chapter3/snackbar/ $ make snackbar snackbar.c:52:1: error: type specifier missing, defaults to 'int' [-Werror,-Wimplicit-int] menu[0].item = "burger";
问题根源
报错的核心原因是在全局作用域中直接执行变量赋值语句。C语言规定,全局作用域仅允许存在变量、函数的声明与初始化代码,独立的赋值操作(比如menu[0].item = "burger";)必须放在函数内部执行。
同时你的代码存在逻辑冗余:已经通过初始化列表给menu数组填充了完整的预设菜单数据,却又重复在全局区域写赋值语句;且add_items函数的逻辑是让用户重新输入所有菜品名称,这和程序"预设菜单、用户点单"的功能目标冲突。
修复步骤
- 删除全局区域中所有直接给
menu数组元素赋值的代码(即从menu[0].item = "burger";到menu[3].price = 7;的所有行) - 移除冗余的
add_items函数声明与调用,因为初始化列表已经完成了预设菜单的填充,无需重复让用户输入菜品名称。
修复后的完整代码
// Find your total cost at a snackbar /** * Beach Burger Shack has the following 10 items on their menu * Burger: $9.5 * Vegan Burger: $11 * Hot Dog: $5 * Cheese Dog: $7 * Fries: $5 * Cheese Fries: $6 * Cold Pressed Juice: $7 * Cold Brew: $3 * Water: $2 * Soda: $2 */ #include <cs50.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <strings.h> // Number of menu items #define NUM_ITEMS 10 // Menu items have item name and price typedef struct { string item; float price; } menu_item; // Array of menu items menu_item menu[NUM_ITEMS] = { {"Burger", 9.5}, {"Vegan Burger", 11}, {"Hot Dog", 5}, {"Cheese Dog", 7}, {"Fries", 5}, {"Cheese Fries", 6}, {"Cold Pressed Juice", 7}, {"Cold Brew", 3}, {"Water", 2}, {"Soda", 2}, }; // Calculate total cost float get_cost(string item); int main(void) { printf("\nWelcome to Beach Burger Shack!\n"); printf("Choose from the following menu to order. Press enter when done.\n\n"); for (int i = 0; i < NUM_ITEMS; i++) { printf("%s: $%.2f\n", menu[i].item, menu[i].price); } printf("\n"); float total = 0; while (true) { string item = get_string("Enter a food item: "); if (strlen(item) == 0) { printf("\n"); break; } total += get_cost(item); } printf("Your total cost is: $%.2f\n", total); } // Search through the menu array to find an item's cost float get_cost(string item) { // Linear search for item for (int i = 0; i < NUM_ITEMS; i++) { if (strcasecmp(menu[i].item, item) == 0) { return menu[i].price; } } // Item was not found return 0.0; }
效果说明
修复后的程序会直接加载预设菜单,提示用户选择菜品,输入回车即可结束点单并计算总费用,完全符合功能需求,且能正常编译运行。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

