es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener un número arbitrario de números decimales de entrada en C?

Estoy haciendo una calculadora de matrices dispersas, y los datos que cada celda contendrá son flotantes.

En un primer escenario, pensé que serían todos enteros (no leí rápido la documentación de la tarea, mis amigos). Así que hice esta línea de código:

scanf("%f%c", &number, &spacing);

Y usé spacing como condición para detener la lectura de entrada. Si spacing era ' ', seguiría leyendo. Sin embargo, si era '\n', entendería que el usuario había terminado la línea actual de la matriz.

Luego descubrí que no, no serán solo enteros, habrá algunos flotantes. Para adaptar mi programa, solo tuve que cambiar el tipo en las estructuras y algunos retornos de función.

Pero ahora tengo este problema: debido al %f%c, si inserto '1 1 1,3 1', mi programa creará CINCO columnas, porque piensa que , es un separador.

¿Cómo puedo cambiar mi scanf para hacer que analice la , como parte de un decimal y ' ' como espaciado? ¿Debería usar RegEx?

Aquí está el código de la función:

Row *createRow(int rowNum)
{
    Row *newRow = mallocRow(rowNum);
    float number = 0.0;
    int col = 0;
    char spacing = ' ';

    do
    {
        scanf("%f%c", &number, &spacing);
        if (number != 0.0)
        {
            appendNode(
                newRow,
                createNode(newRow->row, col, number)
            );
        }
        else
        {
            newRow->size++;
        }
        col++;
    } while (spacing != '\n');

    return newRow;
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para analizar la coma como parte de un decimal, puedes cambiar el especificador de formato %f por %lf, que espera un double en lugar de un float. Luego puedes usar %c para escanear la coma como un carácter. Sin embargo, esto aún deja el problema de analizar un espacio como el separador entre columnas.

    Una solución es usar fgets() para leer una línea de entrada y luego usar sscanf() para analizar la línea, especificando tanto el espacio como la coma como delimitadores. Aquí hay un ejemplo:

    #define MAX_LINE_LENGTH 1000
    
    Fila *crearFila(int numFila)
    {
        Fila *nuevaFila = mallocFila(numFila);
        char linea[MAX_LINE_LENGTH];
        float numero = 0.0;
        int col = 0;
    
        fgets(linea, MAX_LINE_LENGTH, stdin);
        sscanf(linea, "%f,%*c%n", &numero, &col);
        while (col > 0)
        {
            appendNode(
                nuevaFila,
                createNode(nuevaFila->fila, col-1, numero)
            );
            col = 0;
            sscanf(linea, "%*[^ ,]%n", &col);
        }
        nuevaFila->size = col-1;
    
        return nuevaFila;
    }
    

    Este código lee una línea de entrada usando fgets() y la almacena en el búfer linea. Luego usa sscanf() para analizar el primer número en la línea (hasta la coma), y también consume la coma usando %*c. Se usa el especificador de formato %n para obtener el número de caracteres leídos hasta el momento (almacenado en col).

    El código entra en un bucle donde usa sscanf() para hacer coincidir cualquier secuencia de caracteres que no sea un espacio o una coma, y actualiza col con el número de caracteres coincidentes usando %n. Este bucle continúa hasta que no hay más coincidencias (es decir, col es 0). Luego establece el tamaño de la fila según el número de columnas analizadas.

    Nota que este código no maneja errores de entrada (por ejemplo, entrada no numérica), y puede necesitar modificarse según el formato específico de tu entrada.

Comments are closed.