c - How to convert a string to type int or float? -
i have problem putting value of creditos
, nota
in structure.
i have file this, example:
grade: 4.5
i'm using strtok
, returns char pointer, , need int
, float
.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char *nombre; int creditos; float nota; }curso; int conteo(file *_entrada); void semestre(file *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio); void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio); int main(int argc, char *argv[]){ int ganadas=0; int perdidas=0; float promedio=0.0; int cantidad=0; char archivoentrada[256]; curso *materias; printf("archivo de entrada \n"); scanf("%255s",archivoentrada); file *entrada; entrada=fopen(archivoentrada,"r"); if(entrada==null){ printf("no se logro abrir el archivo de entrada\n"); exit(exit_failure); } cantidad=conteo(entrada); materias=(curso *)malloc(sizeof(curso)*cantidad); semestre(entrada,materias,&cantidad,&ganadas,&perdidas,&promedio); imprimir(materias,&cantidad,&ganadas,&perdidas,&promedio); free(materias); } int conteo(file *_entrada){ int i=0; char auxiliar[40]; while(!feof(_entrada)){ fgets(auxiliar,40,_entrada); i++; } rewind(_entrada); return i/3; } void semestre(file *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio){ int i=0; int sumacreditos=0; float sumanotas=0.0; char auxiliar2[100]; char *token; fgets(auxiliar2 ,100,_entrada); while(i<*_cantidad){ fgets(auxiliar2,100,_entrada); token=strtok(auxiliar2,":"); token=strtok(null,":"); printf("dato: %s \n",token); (_materias->nombre)=token; fgets(auxiliar2 ,100,_entrada); token=strtok(auxiliar2,":"); (&_materias->creditos)=token; sumacreditos=sumacreditos+(_materias->creditos); fgets(auxiliar2 ,100,_entrada); token=strtok(auxiliar2,":"); (&_materias->nota)=token; if((_materias->nota)>3.0){ *_ganadas=(*_ganadas)+1; } else{ *_perdidas=(*_perdidas)+1; } sumanotas=sumanotas+((_materias->nota)*(_materias->creditos)); i++; *_materias++; } *_promedio=(sumanotas/sumacreditos); } void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio){ char archivosalida[256]; file *salida; printf("archivo de salida \n"); scanf("%255s",archivosalida); salida=fopen(archivosalida,"w"); if(salida==null){ printf("no se logro abrir el archivo de salida\n"); exit(exit_failure); } int i=0; fprintf(salida,"archivo de salida: \n"); fprintf(salida,"materia\tnota\tcreditos \n"); while(i<*_cantidad){ fprintf(salida,"%s\t%f\t%d \n",(_materias->nombre),(_materias->nota),(_materias->creditos)); _materias++; i++; } fprintf(salida,"\ntotal de materias: %d \n",*_cantidad); fprintf(salida,"materias ganadas: %d \n",*_ganadas); fprintf(salida,"materias perdidas: %d \n",*_perdidas); fprintf(salida,"promedio ponderado: %f \n",*_promedio); }
in code, token
pointer char
, same string in c.
use atoi
convert string int
:
_materias->creditos = atoi(token);
use atof
convert string float
:
_materias->nota = atof(token);
if need make program more robust errors in input file, use strtol
, strtof
instead. harder use more secure if input file can have errors (i.e. always).
alternatively, use sscanf
- it's easier use strtol
, strtof
, , supports detection of errors, has no type safety, may lead hard-to-fix frustrating crashes.
usage:
if (sscanf(token, "%d", &_materias->creditos) != 1) fprintf(stderr, "error\n"); if (sscanf(token, "%f", &_materias->nota) != 1) fprintf(stderr, "error\n");
Comments
Post a Comment