¿Cómo comprobar si una cadena de un archivo de texto es un int, un float o ninguno (string)?

dado un archivo de texto:

123.33 2 1242.1 99.9 2223.11 Hello 22 989.2 Bye 

¿Cómo puedo verificar si una línea es entera o flotante o (ninguna) matriz de caracteres? Si es un int, póngalo en el intArray, si es double / float, póngalo en el doubleArray, o si no lo pone en el charArray

 FILE *file = fopen(argv[1], "r"); char line[100]; int intArray[100]; double doubleArray[100]; char charArray[100]; while(fgets(line, sizeof(line), file) != NULL){ } 

El problema aquí es distinguir entre números enteros y números de punto flotante. Un número con un punto decimal o un exponente o ambos deben considerarse un flotador.

Las funciones estándar antiguas para conversiones numéricas son atoi para enteros y atof para flotadores. Estos analizarán la cadena, pero pueden terminar analizándola solo hasta la mitad. atoi("123.4") se analiza como 123. Por otro lado, atof(118) producirá (correctamente) el número de punto flotante 118.0.

C99 proporciona funciones de análisis más avanzadas, strtol (para enteros largos) y strtod (para dobles). Estas funciones pueden devolver un puntero de cola que apunta al primer carácter que no se convirtió, lo que le permite averiguar si la cadena se analizó completamente o no.

Con esto podemos escribir algunas funciones de envoltorio sencillas que nos dicen si una cadena representa una integración o una flotación. Asegúrate de probar primero los enteros, de modo que "23" se trate como entero:

 #include  #include  #include  int parse_double(const char *str, double *p) { char *tail; *p = strtod(str, &tail); if (tail == str) return 0; while (isspace(*tail)) tail++; if (*tail != '\0') return 0; return 1; } int parse_long(const char *str, long *p) { char *tail; *p = strtol(str, &tail, 0); if (tail == str) return 0; while (isspace(*tail)) tail++; if (*tail != '\0') return 0; return 1; } int main(void) { char word[80]; while (scanf("%79s", word) == 1) { double x; long l; if (parse_long(word, &l)) { printf("Integer %ld\n", l); continue; } if (parse_double(word, &x)) { printf("Double %g\n", x); continue; } printf("String \"%s\"\n", word); } return 0; } 

puedes hacer algo como esto

 FILE *file = fopen(argv[1], "r"); char line[100]; int intArray[100]; double doubleArray[100]; char charArray[100]; int intNum; float floatNum; int i = 0; //index for intArray int j = 0; //index for floatArray while(fgets(line, sizeof(line), file) != NULL){ intNum = atoi(line); if (num == 0 && line[0] != '0') { //it's not an integer floatNum = atof(line); if(/* to put test condition for float */) { //test if it is a float //add to floatArray } else { //or strcpy to charArray accordingly } } else { //it's an integer intArray[i++] = intNum; //add to int array } }