I am having a problem when storing data in a structure, what happens is that when I save a name, all the names are set to the last.
I have a whole day trying to find the error.
Here the code.
#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);
}
}
Input/output
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
You have to copy the strings instead of assigning the pointer directly.
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++;
}
Please add #include <stdlib.h> in order to use malloc() and #include <string.h> in order to use strlen() and strcpy().
As #R.Shrestha pointed out, you have to change scanf("%s", &nombre); to scanf("%s", nombre); because the former statement invokes undefined behavior for passing pointer to data having wrong type to scanf(): %s specifier calls for char*, but you passed char (*)[30].
Change this statement scanf("%s", &nombre); to scanf("%s",nombre);//it is a input of string and '&' should not be used here and use strcpy() to copy string rather than to use assignment operator...Try this
Related
This question already has answers here:
How should character arrays be used as strings?
(4 answers)
Closed 3 months ago.
I have a problem with the a struct´s fields.The code compile but doesn´t work as is should, This is how i define my struct.(Srry for the bad english, its my first time in stackoverflow :)
struct registro {
char Pais[3];
char Nombre[20];
char Apellido[20];
char Clase[1];
char Nivel[2];
char Genero[1];
int Edad;
};
i can write on struct without problem. The words in bold are the ones that i typed
=======Agregue los datos del nuevo estudiante=======
Ingrese Pais : **ARG**
Ingrese Nombre del Estudiante : **Gonzalo**
Ingrese Apellido : **Suarez**
Ingrese Clase Social : **A**
Ingrese Nivel de Ingles : **C1**
Ingrese Edad : **20**
Ingrese Genero : **M**
______________________________
ALUMNO AGREGADO DE FORMA EXITOSA! :)
Desea Agregar otro estudiante: S/N
The problem is when i want to se file this happen:
=======Archivos de Estudiantes=======
ARCHIVO :
___________
Pais : ARGGonzalo
Nombre y Apellido : Gonzalo Suarez
Clase : AC1M
edad : 20
Nivel de ingles : C1M
Genero : M
________________________________
i discovered that for some reason the code saves the field Pais,Clase and Nivel wrong, i checked and its not a problem in the printf, i dont know why or how to fix it, I think that theres some library o im using wrong the scanf
heres the code:
#include"stdio.h"
#include"conio.h"
#include"stdlib.h"
void agregar();
void ver_archivo();
void buscar();
void eliminar();
struct registro {
char Pais[3];
char Nombre[20];
char Apellido[20];
char Clase[1];
char Nivel[2];
char Genero[1];
int Edad;
};
void agregar(){
char respuesta2;
FILE *fp;
int n,i;
struct registro reg;
do{
system("cls");
printf("\t\t\t\t=======Agregue los datos del nuevo estudiante=======\n\n\n");
fp=fopen("Datos.dat","w");
printf("\n\t\t\tIngrese Pais : ");
scanf("%s",®.Pais);
printf("\n\t\t\tIngrese Nombre del Estudiante : ");
scanf("%s",®.Nombre);
printf("\n\t\t\tIngrese Apellido : ");
scanf("%s",®.Apellido);
printf("\n\t\t\tIngrese Clase Social : ");
scanf("%s",®.Clase);
printf("\n\t\t\tIngrese Nivel de Ingles : ");
scanf("%s",®.Nivel);
printf("\n\t\t\tIngrese Edad : ");
scanf("%d",®.Edad);
printf("\n\t\t\tIngrese Genero : ");
scanf("%s",®.Genero);
printf("\n\t\t\t______________________________\n");
if(fp==NULL){
fprintf(stderr,"ERROR: NO SE PUDO ABRIR EL ARCHIVO");
}else{
printf("\t\t\tALUMNO AGREGADO DE FORMA EXITOSA! :)\n");
}
fwrite(®, sizeof(struct registro), 1, fp);
fclose(fp);
printf("\t\t\tDesea Agregar otro estudiante: S/N");
scanf("%s",&respuesta2);
}while(respuesta2=='S');
}
my profesor suggest me to change
fp=fopen("Datos.dat","w");
to
fp=fopen("Datos.dat","wb");
but didnt work
you are putting strings like ARG into a field that is char[3]. Strings in c are zero terminated so you need char[4]. 2 rules for char string in c
always allocate one extra character
make sure that there is a \0 character at the end of the string
sorry for any mistakes, my native language is not english.
I need help with my code:
// Esse programa lê dados de um arquivo TXT, contendo nome, altura e peso
// entao ele retorna esses mesmos dados, alem de informar o IMC da pessoa que esta nos dados
// informando tambem se é obesa ou magra etc.
// Raphael Azambuja Silva Macedo 2020
#include <stdio.h>
#include <stdlib.h>
// Estruturas
typedef struct // Struct das pessoas
{
char nome[100];
int peso;
float altura;
} pessoa;
// Prototipos
float imc(int peso, float altura);
void showIMC(float imcalculado);
void showP(char nome[100], int peso, float altura);
void mIMC(char nome1[100], char nome2[100], int peso1, int peso2, float altura1, float altura2);
pessoa getP(char fns[100]);
// Variaveis externas
const int MAXFN = 50;
int
main()
{
int i=0; // Contador
int n,m; // Valor da struct das pessoas comparadas
char fn[MAXFN]; // Nome do arquivo
float valorimc; // valor do IMC
FILE *file = NULL; // Ponteiro que abre o arquivo
printf("\nDigite o nome do arquivo: ");
scanf("%s", fn);
file = fopen(fn, "r");
if (file == NULL) // Checagem para ver se o arquivo abriu corretamente
{
fprintf(stderr, "ARQUIVO NAO PODE SER ABERTO");
return 0;
}
pessoa z[4]; // Variavel Z da struct pessoa
for (i = 0; i<4 ; i++)
{
z[i] = getP(fn);
valorimc = imc(z[i].peso,z[i].altura); // Chamando a função que calcula o resultado
showP(z[i].nome,z[i].peso,z[i].altura); // Chamando a função que mostra os dados
showIMC(valorimc); // Chamando a função que calcula e mostra o IMC
}
printf("\n=================\n");
printf ("\n\nDigite a enumeracao das pessoas que quer comparar o IMC, sendo a primeira ''0''\n");
scanf(" %d",&n);
scanf(" %d",&m);
mIMC(z[n].nome,z[m].nome,z[n].peso,z[m].peso,z[n].altura, z[i].altura);
fclose(file);
return 0;
}
float // Função que calcula o IMC
imc(int peso, float altura)
{
float resultado;
resultado = peso / (altura*altura);
return resultado;
}
void
showIMC(float imcalculado) // Função que mostra os dados do IMC
{
printf("O IMC dessa pessoa eh: %f" ,imcalculado);
if (imcalculado <= 18.5)
{
printf("\nMagreza");
}
else if (imcalculado > 18.5 && imcalculado <= 24.9)
{
printf("\nPeso normal");
}
else if (imcalculado > 24.9 && imcalculado <= 30)
{
printf("\nSobrepeso");
}
else
{
printf("\nObesidade");
}
}
void
showP(char nome[100], int peso, float altura) // Função que mostra os dados da pessoa
{
printf("\n=================\n");
printf("Nome da pessoa: %s\nPeso da pessoa: %d\nAltura da Pessoa: %f\n",nome,peso,altura);
}
void // Função que compara ambos IMC
mIMC(char nome1[100], char nome2[100], int peso1, int peso2, float altura1, float altura2)
{
int IMC1,IMC2; // IMC de cada Pessoa
IMC1= peso1 / (altura1*altura1);
IMC2= peso2 / (altura2*altura2);
if (IMC1>IMC2)
{
printf("\n=====================\n");
printf("A pessoa %s tem o menor IMC." ,nome2);
}
else if (IMC2>IMC1)
{
printf("\n=====================\n");
printf("A pessoa %s tem o menor IMC." ,nome1);
}
else
{
printf("\n=====================\n");
printf("As duas pessoas tem o mesmo IMC.");
}
}
pessoa getP(char fns[100])
{
pessoa t;
FILE *file = fopen(fns, "r");
fscanf (file, " %[^0123456789] %d %f" ,t.nome,&t.peso,&t.altura);
return t;
}
What I need to do is:
Every time I call the ''getP'' function I need to read a diferent line of info from the txt file, however, every time the function is called it starts reading from the beginning, so I always get the first line.
The txt file is:
beltano das couves 90 1.7
fulano de tal 80 1.7
sicrano de tel 75 1.7
deltrano de tol 70 1.7
First of all, I want to explain my vocabulary of functions:
Universo: Universe
Edad: Age
Nombre: Name
Alias: Nickname
Nacionalidad: Country
Persona: Person
Insertar persona: Add Person to the Struct array
Mostrar persona: Print all the struct array elements
So I want to create a struct array and an options table in where I can choose to add persons or print them. The program max person capacity is 1000 and it checks if the person is already in the array or not, adding ir if so.
So I don't understand in first place why it doesnt print all the persons and if the persons actually are stored. Can you help me? It is a class work and I can't complicate it more that, so pointers aren't allowed. This is my code:
#include <stdio.h>
#include <stdlib.h>
#define MAX_CAD 100
#include <string.h>
#include <ctype.h>
struct persona{
char nombre[MAX_CAD];
int edad;
char nacionalidad[MAX_CAD];
char alias[MAX_CAD];
};
int insertarPersona(struct persona universo[], int capacidad_max, struct persona nueva);
void mostrarMundo(struct persona universo[], int capacidad_max);
int main()
{
int seleccion, capacidadmax=1000, i=0;
struct persona universo[1000];
struct persona nueva;
strcpy(universo[i].nombre, "-");
strcpy(universo[i].nacionalidad, "-");
strcpy(universo[i].alias, "-");
universo[i].edad = -1;
do{
printf("1-Crear persona \^\// \n");
printf("2-Mostrar universo |. .| \n");
printf("3-Thanos-Chascar _ \ - / _ \n");
printf("4-Restaurar universo \_| |_/ \n");
printf("5-Salir \ \ \n");
printf(" __/_/__\n");
printf(" | |\n");
printf(" \ /\n");
printf(" \___/\n");
scanf("%d", &seleccion);
if(seleccion==1&&i<1000){
printf("Introduzca el nombre de la persona a añadir\n");
while(getchar()!='\n');
gets(nueva.nombre);
printf("Introduzca el alias de la persona a añadir\n");
gets(nueva.alias);
printf("Introduzca la nacionalidad de la persona a añadir\n");
gets(nueva.nacionalidad);
printf("Introduzca la edad de la persona a añadir\n");
scanf("%d", &nueva.edad);
if(insertarPersona(universo, capacidadmax, nueva)==1){
strcpy(universo[i].nombre, nueva.nombre);
strcpy(universo[i].alias, nueva.alias);
strcpy(universo[i].nacionalidad, nueva.nacionalidad);
universo[i].edad=nueva.edad;
printf("Persona añadida!\n");
i++;
}
else{
printf("El universo esta lleno o dicha persona ya esta dentro\n");
}
}else if(seleccion==2){
printf("pers. Nombre\t\t\t\t\t Alias\t\t\t\t Nacionalidad\t\t\t Edad\n");
printf("=====================================================================================================================\n");
mostrarMundo(universo, capacidadmax);
}
printf("%d",i);
}while (seleccion !=5);
return 0;
}
int insertarPersona(struct persona universo[], int capacidad_max, struct persona nueva){
capacidad_max=1000;
int espersona=0;
for(int i=0; i=='\0'&& i<capacidad_max;i++){
if ((strcmp(nueva.nombre, universo[i].nombre)&& (nueva.edad!=universo[i].edad)&& strcmp(nueva.nacionalidad, universo[i].nacionalidad)&& strcmp(nueva.alias, universo[i].alias)) !=0 && i<1000){
espersona=1;
}else {
espersona=0;
}
}
return espersona;
}
void mostrarMundo(struct persona universo[], int capacidad_max){
capacidad_max=1000;
for(int i=0; i=='\0'&&i<capacidad_max; i++){
printf("%d\t%-35s%-25s\t%-20s%10d\n", i+1, universo[i].nombre, universo[i].alias, universo[i].nacionalidad, universo[i].edad);
if(universo==0){
printf("Universo no habitado\n");
}
}
}
I have this code and I don't know why after, I ask if you want to introduce another student and I say 1 or 0 the program ends and said segmentation fault (core dumped).
I ask to introduce another student in _nodo *insertaEnLista
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
struct actividades
{
char tipoDeActividad[22];
char diaDeLaSemana[12];
char horaDeIncio[8];
char horaDeFin[8];
};
struct materias
{
char nombre[30];
char profesor[30];
char tipoDeMateria[20];
struct actividades *actividad;
};
struct alumnos
{
char nombre[30];
int cedula;
int telefono;
struct materias *materia;
struct alumnos *siguiente;
};
typedef struct alumnos _nodo;
_nodo *crearLista(_nodo *apuntador);
bool listaVacia(_nodo *apuntador);
_nodo *insetarEnLista(char nombre[], long cedula, long telefono, _nodo *apuntador);
void imprimirLista (_nodo *apuntador);
_nodo *crearNodo(char nombre[], long int cedula, long int telefono);
//AQUI SE CREA LISTA Y SE PONE PARA QUE APUNTE A NULL
_nodo *crearLista(_nodo *apuntador)
{
return (apuntador = NULL);
}
//ESTA FUNCION VERIFICA SI LA LISTA ESTA VACIA
bool listaVacia(_nodo *apuntador)
{
if (apuntador == NULL)
return (true);
else
return (false);
}
//AQUI SE CREA EL NUEVO NODO DE LA LISTA
_nodo *crearNodo(char nombre[], long cedula, long telefono)
{
_nodo *registroNuevo;
registroNuevo = (_nodo *) malloc(sizeof(_nodo));
printf("\n----NUEVO ELEMENTO----\n");
printf("NOMBRE: ");
fflush(stdin);
scanf("%s",nombre);
printf("CEDULA: ");
fflush(stdin);
scanf("%ld", &cedula);
printf("TELEFONO: ");
fflush(stdin);
scanf("%ld", &telefono);
fflush(stdin);
strcpy(registroNuevo->nombre, nombre);
registroNuevo->cedula = cedula;
registroNuevo->telefono = telefono;
registroNuevo->siguiente = NULL;
return registroNuevo;
}
//AQUI SE INSERTA EL NODO EN LA LISTA LUGEO DE SER CREADO POR LA FUNCION crearNodo
_nodo *insetarEnLista(char nombre[], long cedula, long telefono, _nodo *apuntador)
{
_nodo *registroNuevo, *apuntadorAuxiliar;
char respuesta,ch;
do
{
registroNuevo=crearNodo(nombre, cedula, telefono);
if (listaVacia(apuntador)) apuntador = registroNuevo;
else
{
apuntadorAuxiliar = apuntador;
while (apuntadorAuxiliar->siguiente != NULL)
apuntadorAuxiliar = apuntadorAuxiliar->siguiente;
apuntadorAuxiliar->siguiente = registroNuevo;
}
printf("\nPARA INGRESAR A OTRO ALUMNO MARQUE... 1");
printf("\nPARA SALIR MARQUE... '0'\n");
while((ch = getchar()) != EOF && ch != '\n');
scanf("%c", &respuesta);
fflush(stdin);
printf("RESPUESTA = %c", respuesta);
}while (strcmp(&respuesta, "1")==0);
return apuntador;
}
//IMPRIMIR LOS NODOS DE LA LISTA
void imprimirLista (_nodo *apuntador)
{
_nodo *apuntadorAuxiliar;
apuntadorAuxiliar = apuntador;
if (apuntador == NULL)
printf("NO HAY ELEMENTOS EN LA LISTA \n");
else
{
while(apuntador != NULL)
{
printf(" \n------------NODO-------------- ");
printf("\nNOMBRE: %s \n\n", apuntadorAuxiliar->nombre);
printf("\n\nCEDULA: %d \n", apuntadorAuxiliar->cedula);
printf("\nTELEFONO: %d \n", apuntadorAuxiliar->telefono);
apuntadorAuxiliar = apuntadorAuxiliar->siguiente;
}
}
return;
}
int main()
{
/*printf("INTRODUZCA LOS NUMEROS DE CEDULA QUE DESEA IMPRIMIR \n");*/
_nodo *inicioLista;
int cedula;
int telefono;
char nombre[20];
inicioLista = crearLista(inicioLista);
inicioLista = insetarEnLista(nombre, cedula, telefono, inicioLista);
imprimirLista(inicioLista);
return 0;
}
How can I do to fix the problem.
You should step through the code in a debugger and look at the variables at each step to determine the line of code that is causing the issue.
Here is one issue, there may be others.
In this line
}while (strcmp(&respuesta, "1")==0);
you are using strcmp with a variable (respuesta) that contains a single character. strcmp is expecting a null terminated string (an array of characters with a zero byte at the end). As you may not have a zero byte after the variable, this may cause strcmp to read memory that it shouldn't (this is a buffer overrun)
Much simpler to just use:
}while (respuesta == '1');
Im working on an implementation of Keccak(SHA-3) and for example I got this:
Keccak("abc") = 3A985DA74FE225B245C172D6BD390BD855F86E3E9D525B46BFE24511431532
Instead of (according: http://www.di-mgt.com.au/sha_testvectors.html)
3A985DA74FE225B2045C172D6BD390BD855F086E3E9D525B46BFE24511431532
As you can see my program miss a "0x00" and Im not sure what I am doing wrong.
Sorry guys here it is my main method code:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "round.h"
#include "keccak.h"
#define TAM_MAX_ENTRADA 4096 /*Especificacion del numero de caracteres de la entrada*/
int main(int argc, char *argv[])
{
int32_t sha3Tipo; /*Nos dice el tipo de SHA3*/
char Mensaje[TAM_MAX_ENTRADA]; /*Array de caracteres donde guardamos el mensaje de entrada*/
printf("Elige el tamaño de salida (224,256,384,512): ");
scanf("%d",&sha3Tipo);
if(argc == 1)
{
strcat(Mensaje,""); /*Si no nos han pasado argumentos significa que es un string vacio*/
}
else
{
strcpy(Mensaje,argv[1]); /*Copiamos la primera palabra en el array de caracteres*/
}
for(int32_t i = 2; i<argc; i++)
{
strcat(Mensaje," "); /*Si tenemos mas de una palabra entonces anadimos */
strcat(Mensaje,argv[i]);
}
int32_t size = strlen(Mensaje);
int32_t *psize = &size;
uint8_t *newmessage;
newmessage=keccak((uint8_t *)Mensaje, *psize, sha3Tipo);
printf("Keccak(\"%s\") = ",Mensaje);
for(int32_t i =0; i<sha3Tipo/8; i++)
{
printf("%X", *(newmessage+i));
}
printf("\n");
return 0;
}
Perhaps you're losing the leading zeroes when converting the numbers into hexadecimal strings? For example, consider the following code:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Without formatting: %x and %x\n", 12, 99);
printf("With formatting: %02x and %02x\n", 12, 99);
return 0;
}
When run, the output is:
Without formatting: c and 63
With formatting: 0c and 63
I'm thinking that your 4 and 8 should be 04 and 08, but they are not being formatted correctly.