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

标签 c pointers struct int string-parsing

我在将 creditosnota 的值放入结构中时遇到问题。

我有一个文件,例如:

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);

如果您需要使程序对输入文件中的错误更健壮,请使用 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"); 

关于c - 如何将字符串转换为 int 或 float 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32917200/

相关文章:

c - 是否应该在可用的地方使用命名地址空间?

c - 如何在 C 中使用指针算术将值从一个数组复制到另一个数组

c++ - C++ 对象成员数组的默认初始化?

arrays - 我们如何在 golang 的结构中初始化结构类型的数组(存储 json 输出)

c++ - 如何在运行时增加结构数组大小

c - Valgrind fatal error ,在 Slitaz 上运行

c++ - 算术运算和编译器优化

c++ - 如何使用自动依赖生成器编写 make 文件

c# - 如何使用图像作为鼠标指针而不是使用 C# 的默认箭头?

json - 如何将嵌套的 JSON 解析为 Go 中的结构?