繁体   English   中英

如何将字符串转换为int或float类型?

[英]How to convert a string to type int or float?

我在结构中放置creditosnota的值时creditos问题。

我有一个与此相关的文件,例如:

等级:4.5

我正在使用strtok ,但是它返回一个char指针,并且我需要一个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);
}

在您的代码中, token是指向char的指针,它与C中的字符串相同。

使用atoi将字符串转换为int

_materias->creditos = atoi(token);

使用atof将字符串转换为float

_materias->nota = atof(token);

如果需要使程序对输入文件中的错误更健壮,请改用strtolstrtof 如果您的输入文件可能有错误(即总是存在),它们将更难使用,但会更安全。


或者,使用sscanf -它可能比strtolstrtof容易使用,并且支持错误检测,但是它没有类型安全性,因此可能导致难以修复的令人沮丧的崩溃。

用法:

if (sscanf(token, "%d", &_materias->creditos) != 1)
    fprintf(stderr, "Error\n"); 

if (sscanf(token, "%f", &_materias->nota) != 1)
    fprintf(stderr, "Error\n"); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM