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

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -