我在这种结构上存在细分错误问题。我尝试使用strcpy
将char值复制到列表结构,但没有用。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct Elemento_FILA{
// int cod_cliente, consumo, dia_venc, mes_venc, ano_venc;
// float preco_un,valor_total;
char nome_cliente[40];
struct Elemento_FILA *proximo;
} Elemento_Fila;
typedef struct Fila{
struct Elemento_FILA *inicio;
struct Elemento_FILA *fim;
} Fila;
int escolha;
Fila* Criar_Fila(){
Fila *f = (Fila*) malloc(sizeof(Fila));
if(!f)
exit(1);
else {
f->inicio = NULL;
f->fim = NULL;
}
return f;
}
int Fila_Vazia(Fila *f){
if(f==NULL) return 1;
if(f->inicio==NULL) return 1;
else return 0;
}
int Ler_Cod(){
int cod;
printf (" Digite o código para o cliente: ");
scanf("%i",&cod);
return cod;
}
char* Ler_Nome() {
char* nome_cliente = malloc(40*sizeof(char));
printf(" Digite o nome do cliente: ");
scanf("%s", &nome_cliente);
return nome_cliente;
}
int Ler_Consumo(){
int consumo;
printf (" Digite o consumo para o cliente: ");
scanf("%i",&consumo);
return consumo;
}
Elemento_Fila* Alocar(const char* nome){
Elemento_Fila *no_fila = (Elemento_Fila*)malloc(sizeof(Elemento_Fila));
if(!no_fila)
exit(1);
else{
strcpy(no_fila->nome_cliente,nome);
return no_fila;
}
}
void Enfileirar(Fila *f){
Elemento_Fila *no_fila = Alocar(Ler_Nome());
if(!no_fila)
exit(1);
if(f->fim == NULL)
f->inicio = no_fila;
else
f->fim->proximo = no_fila;
f->fim = no_fila;
}
int Desenfileirar(Fila *f){
if(Fila_Vazia(f)) return 0;
Elemento_Fila *no_fila = f->inicio;
f->inicio = f->inicio->proximo;
if(f->inicio==NULL)
f->fim = NULL;
free(no_fila);
return 1;
}
void Exibir_Fila(Fila *f){
if(Fila_Vazia(f)){
printf (" Fila Vazia!\n");
printf ("\n Fila End. Inicio %p: ", f->inicio);
printf ("\n Fila End. Fim %p: ", f->fim);
return ;
}
Elemento_Fila *aux = f->inicio;
printf ("\n Fila Atual: ");
printf ("\n Fila End. Inicio %p: ", f->inicio);
printf ("\n Fila End. Fim %p: ", f->fim);
printf ("\n");
while(aux!=NULL){
printf ("\n\t Nome: %s \tEndereco: %p ==> %p", aux->nome_cliente, aux, aux->proximo);
aux = aux->proximo;
}
printf ("\n");
}
void opcoes(int escolha, Fila *f){
switch(escolha){
case 1:
Enfileirar(f);
Exibir_Fila(f);
break;
case 2:
Desenfileirar(f);
Exibir_Fila(f);
break;
default:
if (escolha!=0) printf (" Opção Inválida!\n");
}
}
int menu(){
printf ("\n Opções da Fila;\n");
printf (" 0 Sair;\n");
printf (" 1 Inserir na Fila;\n");
printf (" 2 Retirar da Fila;\n");
printf (" Escolha: ");
scanf("%i", &escolha);
return escolha;
}
int main (void){
Fila *f = Criar_Fila();
do{
escolha = menu();
opcoes(escolha,f);
}while(escolha);
return 0;
}
此方法:
char Ler_Nome() {
char nome_cliente[40];
printf(" Digite o nome do cliente: ");
scanf("%s", &nome_cliente);
return nome_cliente;
}
返回本地变量nome_cliente。
由于nome_cliente是在堆栈上分配的,因此返回时该对象将消失。
这是一个严重的错误。永远不要这样做。
如果需要返回数组,则必须在堆上分配它:
char* Ler_Nome() {
char* nome_cliente= malloc(40*sizeof(char));
printf(" Digite o nome do cliente: ");
scanf("%s", &nome_cliente);
return nome_cliente;
}
请注意,创建destroyNome()函数也是一种很好的做法,因为负责创建的API也应负责其销毁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句