使用 Xcode 控制到达非 void 函数 C 编程的末尾

标签 c

库存2.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inventory2.h"

item_t *inventory[30];
int next=0;

int getNextId() {
    static int id=0;
    return id++;
}

void printItem(item_t *p){
    printf("\n\tpart name: %s", p->name);
    printf("\n\tpart number: %s", p->partNo);
    printf("n\tpart quantity: %d", p->quantity);
    printf("\n\tpart price: %f", p->price);
    printf("n\t\tpart cost: %f", p->cost);

}
printInventory() {
    register int i;
    for(i=0; i<next; i++) {
        printItem(inventory[i]);

    }

} <-THIS IS WHERE THE ERROR OCCURS

int createItem() {
    item_t *p;
    char buf[50];
    buf[0] = '\0';

    p = (item_t*) malloc(sizeof(item_t));
    if(!p) {

        printf("ERROR: no memory for createItem()\n");
        return FALSE;
    }

    p->id=getNextId();
    printf("\n\tEnter part name: ");
    fgets(p->name, 50, stdin);
    p->name[strlen(p->name)-1] = '\0';

    printf("\n\tEnter part number ");
    fgets(p->partNo, 30, stdin);
    p->partNo[strlen(p->partNo)-1] = '0';

    printf("\n\tEnter part quantity: ");
    fgets(buf, 50, stdin);
    buf[strlen(buf)-1] = '\0';
    p->quantity = atoi(buf);

    printf("n\tEnter part price: ");
    fgets(buf, 50, stdin);
    buf[strlen(buf)-1] = '\0';
    p->price = (float) atof(buf);

    printf("n\tEnter part cost: ");
    fgets(buf, 50, stdin);
    buf[strlen(buf)-1] = '\0';
    p->cost = (float) atof(buf);

    inventory[next++] = p;
    return TRUE;
} 

int writeInventory() {
    FILE *fp;
    int num, i;
    item_t*p;

    fp = fopen("inventory.db", "rb");
    for(i=0; i<next; i++){
        p = (item_t*) malloc(sizeof(item_t));
        if(!p) {
            printf("ERROR: no memory for createItem()\n");
            return FALSE;
        }
        inventory[i] = p;
        num = fread(inventory[i], sizeof(item_t), 1, fp);
        if(num == 0) {
            return -1;
        }

        next ++;

    }
    fclose(fp);
    return 0;
}

主要2.c

#include <stdio.h>
#include <string.h>    
#include "inventory2.h"

int mainMenu (){

    char buf[50], *p;
    buf[0] = '\0';

    printf("\n\tSelect from the following commandsL (L)ist, (A)dd, (R)emove,         (I)mport, (E)xport, or (Q)uit: ");
    fgets(buf, 50, stdin);
    buf[strlen(buf) -1] = '\0';
    p = _strupr(buf);
    switch(*p) {
        case 'L':
            printInventory();
            break;
        case 'A':
            createItem();
            break;
        case 'R':
        case 'I':
            readInventory();
            break;
        case 'E':
        case 'Q':
            writeInventory();
            return FALSE;
        default:
            printf("\n\t\tERROR: invalid option selected!\n");
    }
    return TRUE;
}

int main (void) {

    item_t *i;
    int loop = TRUE;

    while (loop) {
        loop= mainMenu();
    }

    return 0;
}

库存2.h

#define TRUE 1
#define FALSE 0

typedef struct {
    int id;
    char name[50];
    char partNo[30];
    float price;
    float cost;
    int quantity;
}   item_t;

int createItem();
int writeInventory();
item_t *readInventory();
int printInventory(void);

创建一个名为 ICP.exe 的库存控制程序。该程序将为用户提供控制库存的操作菜单,其中包括:列出库存、创建商品、添加库存、删除库存、删除商品、导入和导出数据库。

库存商品具有:唯一 ID、零件编号、名称、数量、销售价格和单价。

加载包含以下项目的数据库:

  1. SNK809a 精工自动男士 watch ,10 block ,75 美元,70 美元。

  2. SR400 雅马哈 400cc 摩托车,3 辆,5,999 美元,4,000 美元。

  3. Soundlink-Coral Bose 珊瑚红蓝牙扬声器,20 件,129 美元,89 美元。

演示加载/创建库存数据库、创建新商品、添加到库存、从库存中删除以及保存数据库。

使用截图工具捕获输出。

菜单可能如下所示,但学生可以自由创建不同的界面(如果更直观的话)。

c:\users\dbs0011\icp.exe

欢迎使用库存控制计划!

从以下选项中选择 (L)ist、(C)reate、(A)dd、(R)emove、(I)mport 或 (E)xport:> I

输入要导入的数据库名称:>first.db

导入了first.db。

从以下选项中选择 (L)ist、(C)reate、(A)dd、(R)emove、(I)mport 或 (E)xport:> I

最后构建导入和导出函数,因为我们直到本项目结束之前才会介绍文件。使用动态内存分配来记录。每个接口(interface)选项应该是一个单独的函数。使用结构来定义您的库存项目。使用单独的 C 文件来封装您的用户界面、数据存储和测试功能。

最佳答案

printInventory() {
register int i;
for(i=0; i<next; i++) {
    printItem(inventory[i]);

}

} <-THIS IS WHERE THE ERROR OCCURS

在老式 C 语言中。如果您没有指定函数的返回类型,则默认为 int。在上述情况下,printInventory 没有返回类型,因此编译器期望返回 int

函数中没有 return 语句作为最后一个语句,因此编译器不知道要返回什么值。

修复方法:

  1. 设置显式返回类型 void。
  2. 添加 return 0; 作为函数的最后一条语句。

我认为这在现代 C 中已得到解决。但我不知道 XCode 如何调用编译器。

关于使用 Xcode 控制到达非 void 函数 C 编程的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47020759/

相关文章:

c - 它会定义结构的结构吗?

javascript - 将基于 JIT 的 lang 编译为 Webassembly

c - 尽管 lowfree 大小约为 523MB,kmalloc 仍失败

C 将随机矩阵写入文件,然后使用格式化 I/O 从文件中读取和复制所述矩阵

c# - ECDSA 登录 c# 在 c 中验证

将一条语句乘以 N 次的 C 宏魔法

编译特定源列表并生成依赖关系

c - 为了使用 UNIX 库 punctionclear() 我需要什么头文件

c - 使两个结构相等但想要更改其中一个字段

c - 使用 POSIX QUEUE 完成后该怎么做