2016-03-13 3 views
-2

У меня возникла проблема при хранении данных в структуре, что происходит, когда я сохраняю имя, все имена установлены в последний.Хранение данных в массиве

У меня есть целый день, пытаясь найти ошибку.

Здесь код.

#include <stdio.h> 

typedef struct { 
    int id; 
    char *nombre; 
    int saldo; 
} CLIENTES; 

CLIENTES Cliente[5]; 
int n_client = 0; 
void RegistrarCliente (char *nom, int saldo); 
void Listar(); 
int n_client; 

void main (void) 
{ 
    for (int i = 0; i < 5; i++) { 
     char nombre[30]; 
     scanf ("%s", &nombre); 
     RegistrarCliente (nombre, 250); 
    } 
    Listar(); 
} 

void RegistrarCliente (char *nom, int saldo) 
{ 
    Cliente[n_client].id = n_client; 
    Cliente[n_client].nombre = nom; 
    Cliente[n_client].saldo = saldo; 
    printf ("Cliente: %s registrado con una deuda de %d\n", 
      Cliente[n_client].nombre, Cliente[n_client].saldo); 
    n_client++; 
} 

void Listar() 
{ 
    printf ("%-10s%-13s%-10s\n", "ID", "NOMBRE", "SALDO"); 
    for (int i = 0; i < n_client; i++) { 
     printf ("%-10d%-13s%-10d\n", Cliente[i].id, Cliente[i].nombre, 
       Cliente[i].saldo); 

    } 
} 

вход/выход

Jhosh 
    Cliente: Jhosh registrado con una deuda de 250 
    Leo 
    Cliente: Leo registrado con una deuda de 250 
    Jhonny 
    Cliente: Jhonny registrado con una deuda de 250 
    Stweart 
    Cliente: Stweart registrado con una deuda de 250 
    Carlos 
    Cliente: Carlos registrado con una deuda de 250 
    ID  NOMBRE  SALDO 
    0   Carlos  250 
    1   Carlos  250 
    2   Carlos  250 
    3   Carlos  250 
    4   Carlos  250 
+0

['int main'] (http://c-faq.com/ansi/voidmainbooks.html) –

ответ

1

Вы должны скопировать строки вместо назначения указателя непосредственно.

void RegistrarCliente(char * nom, int saldo) 
{ 
    Cliente[n_client].nombre = malloc(strlen(nom) + 1); /* +1 for terminating null-character */ 
    if(Cliente[n_client].nombre == NULL) 
    { 
     perror("malloc"); 
     return; 
    } 
    Cliente[n_client].id = n_client; 
    strcpy(Cliente[n_client].nombre, nom); 
    Cliente[n_client].saldo = saldo; 
    printf("Cliente: %s registrado con una deuda de %d\n", Cliente[n_client].nombre, Cliente[n_client].saldo); 
    n_client++; 
} 

Пожалуйста, добавьте #include <stdlib.h>, чтобы использовать malloc() и #include <string.h> для того, чтобы использовать strlen() и strcpy().

Как @ R.Shrestha указал, вы должны изменить scanf("%s", &nombre); к scanf("%s", nombre);, потому что прежнее заявление вызывает неопределенное поведение для передачи указателя на данные, имеющую неправильный тип для scanf(): %s спецификатора вызовов для char*, но вы прошли char (*)[30].

0

Изменить это утверждение scanf ("% s", & nombre); to scanf ("% s", nombre); // это ввод строки, а '&' не следует использовать здесь и использовать strcpy() для копирования строки, а не для использования оператора присваивания ... Попробуйте это

+0

Также'% 29s' предотвратит переполнение буфера –

Смежные вопросы