C语言编译报linker command failed with exit code 1错误如何解决
报错根本原因
你遇到的三个链接错误都是语法和函数定义规则错误导致的:
undefined reference to 'N':你开头用extern char (N[][40]);声明了一个外部全局变量N,但你的代码里从来没有在全局作用域定义过这个变量,链接器找不到对应的实体就报错,这个extern声明完全是多余的,直接删掉即可。undefined reference to 'Digitanome'/undefined reference to 'Lista':C语言不允许嵌套定义函数,你把这两个函数的实现写在了main函数内部,这不被标准C支持,你提前声明的是全局作用域的两个函数,链接器找不到对应的全局实现就报错。
除此之外你的代码还有大量逻辑错误,无法实现需求:
- 你在main函数里写的
int Digitanome(char N[][40], int i);后面的块不是合法的函数定义,里面还递归调用Digitanome会直接触发死循环 - 你在输入商品名的逻辑后面直接写了
return 0;,后面输入价格、是否继续购买的代码完全不会执行 - 你只用了一个
Supermercado compra全局变量,每次输入新商品都会覆盖旧商品的信息,根本无法保存商品列表 soma2是int类型,累加float类型的商品价格会丢失小数精度,打印用%i也不符合类型要求- strcpy用法错误,
*compra.seçao = *strcpy(compra.seçao,"Frutas");等同于只复制字符串的第一个字符给seçao的第一个元素,直接写strcpy(compra.seçao,"Frutas")即可
修复步骤
- 删除开头多余的
extern char (N[][40]);声明 - 把Digitanome、Lista两个函数的实现移到main函数外部,禁止嵌套在main里
- 定义一个Supermercado数组来存储所有购买的商品,不要只用单个变量
- 删除main函数里中途的
return 0;语句,让后续逻辑能正常执行 - 把soma2的类型改成float,打印的时候用
%.2f格式化输出保留两位小数 - 移除strcpy前面的多余指针操作,修正字符串复制逻辑
- 修正Lista函数的打印逻辑,遍历存储商品的数组输出所有商品
参考修复代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_PROD 100 // 支持的最大商品数量 typedef struct { char produto[30]; char seçao [30]; float preco; }Supermercado; // 函数定义移到main外部 int Digitanome(char N[][40], int i) { printf("Informe o produto que você quer nesta seção: \n"); scanf("%s", N[i]); return ++i; } void Lista(Supermercado compras[], int qtd) { int j = 0; printf("\n=== 商品列表 ==="); for (; j < qtd; j++ ) { printf("\n分类:%s | 商品名:%s | 价格:%.2f", compras[j].seçao, compras[j].produto, compras[j].preco); } printf("\n================"); } int main(void) { Supermercado compras[MAX_PROD]; int qtdNomes = 0; float soma2 = 0; int cod, cont; char Nome[100][40] = { '\0' }; do{ printf("\n\nEm qual seção está seu produto?"); printf("\n1-Frutas \n2-Doces \n3-Material de Limpeza\n --> "); scanf("%d",&cod); if(cod == 1){ strcpy(compras[qtdNomes].seçao,"Frutas"); } else if(cod == 2){ strcpy(compras[qtdNomes].seçao, "Doces"); } else if(cod == 3){ strcpy(compras[qtdNomes].seçao,"Material de Limpeza"); } qtdNomes = Digitanome(Nome, qtdNomes); strcpy(compras[qtdNomes-1].produto, Nome[qtdNomes-1]); printf("Informe o preço do produto: \n"); scanf("%f", &compras[qtdNomes-1].preco); soma2 = soma2 + compras[qtdNomes-1].preco; printf("\nDeseja mais algum produto? \n4-Sim \n0-Não, sair \n --> "); scanf("%d",&cont); }while(cont == 4 && qtdNomes < MAX_PROD); printf("\nFIM DAS COMPRAS!\n"); Lista(compras, qtdNomes); printf("\nEssa compra está custando: %.2f \n", soma2); return 0; }
内容的提问来源于stack exchange,提问作者Lorena Santos
相关产品推荐
相关产品推荐

