我在将 creditos
和 nota
的值放入结构中时遇到问题。
我有一个文件,例如:
Grade: 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中的string相同。
使用atoi
将字符串转换为int
:
_materias->creditos = atoi(token);
使用atof
将字符串转换为float
:
_materias->nota = atof(token);
如果您需要使程序对输入文件中的错误更健壮,请使用 strtol
和 strtof
反而。如果您的输入文件可能有错误(即总是),它们更难使用但更安全。
或者,使用 sscanf
- 它可能比 strtol
和 strtof
更容易使用,并且支持错误检测,但它没有类型安全性,因此可能会导致难以修复的令人沮丧的崩溃。
用法:
if (sscanf(token, "%d", &_materias->creditos) != 1)
fprintf(stderr, "Error\n");
if (sscanf(token, "%f", &_materias->nota) != 1)
fprintf(stderr, "Error\n");
关于c - 如何将字符串转换为 int 或 float 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917200/