在结构中存储数据时遇到问题,当我保存名称时,所有名称都设置为最后一个。
我有一整天的时间试图找到错误。
这里的代码。
#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 :(得分: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);
,因为前一个语句调用未定义的行为,用于将指向错误类型的数据的指针传递给{ {1}}:scanf()
说明符要求%s
,但您通过了char*
。
答案 1 :(得分:0)
更改此语句scanf(“%s”,&amp; nombre); to scanf(“%s”,nombre); //它是字符串和'&amp;'的输入不应该在这里使用并使用strcpy()来复制字符串而不是使用赋值运算符...试试这个