C – Dos tipos de entrada de usuario formateada con un número desconocido de entradas.
Quiero que el usuario pueda ingresar dos tipos de entrada: “C[tamaño_t]” y “O[dirección de memoria]”, y dependiendo de si es una C o una O al principio, llamaré a diferentes funciones. También quiero poder recibir un número desconocido de estas entradas y en cualquier orden.
Mi forma de solucionarlo fue algo así:
int main()
{
// variables
while (1) { // Bucle infinito para recibir múltiples entradas de cantidad desconocida?
while (fgets(input, BUFFER_SIZE, stdin)) {
if (sscanf(input, "%c%zu", &branch, &num) == 2) {
if (strcmp(branch, "C")
// llamada a la función
} else if (sscanf(input, "%c%c", &branch, (char *)addr) == 2) {
if (strcmp(branch, "O")
// llamada a la función
}
}
}
return 0;
}
Entiendo por qué no está funcionando, por supuesto, y sé que mi “no solución” está mal, pero no tengo idea de cómo abordarlo de otra manera. El código recibe la primera entrada y se bloquea y si comienzo con una entrada que comienza con O, entrará en la primera declaración “if” cuando no debería. Tampoco estoy seguro si mi bucle “while(1)” es la forma correcta de manejar las múltiples entradas del usuario.
davy.ai
Para manejar las entradas del usuario para “C[tamaño_t]” y “O[dirección de memoria]”, se pueden usar expresiones regulares para buscar un patrón de entrada. Aquí hay un ejemplo de implementación:
Esta implementación utiliza
fgets()
para leer la entrada del usuario yregexec()
para buscar el patrón de entrada utilizando expresiones regulares. Las expresiones regulares"^C(\\d+)$"
y"^O(0[xX][0-9a-fA-F]+)$"
buscan entradas que comiencen con “C” u “O”, seguido de un número decimal o una dirección hexadecimal de memoria, respectivamente.El programa lee la entrada en un bucle infinito hasta que se alcance el número máximo de entradas. La función
strtoul()
se utiliza para convertir la cadena de entrada a un entero largo sin signo.Tenga en cuenta que es necesario incluir el archivo de encabezado
regex.h
y enlazar con la bibliotecalibregex
utilizando la opción-lregex
al compilar el programa.</regex.h></stdio.h>