pedir lenguaje leer imprimir fscanf datos caracteres cadenas cadena c string-parsing scanf

lenguaje - Obtener el número de caracteres leídos por sscanf?



printf en c (2)

Puede usar el especificador de formato %n y proporcionar un argumento int * adicional a sscanf() :

int pos; sscanf(expression, "%lf%n", &value, &pos);

Descripción para el especificador de formato n del estándar C99:

No se consume ninguna entrada. El argumento correspondiente será un puntero al entero con signo en el que se escribirá el número de caracteres leídos desde el flujo de entrada hasta el momento por esta llamada a la función fscanf . La ejecución de una directiva %n no incrementa el recuento de asignaciones devuelto al finalizar la ejecución de la función fscanf . Ningún argumento se convierte, pero uno se consume. Si la especificación de conversión incluye un carácter de supresión de asignación o un ancho de campo, el comportamiento no está definido.

Siempre verifique el valor de retorno de sscanf() para asegurarse de que se realizaron asignaciones, y el código subsiguiente no procesa por error las variables cuyos valores no se modificaron:

/* Number of assignments made is returned, which in this case must be 1. */ if (1 == sscanf(expression, "%lf%n", &value, &pos)) { /* Use ''value'' and ''pos''. */ }

Estoy analizando una cadena (a char* ) y estoy usando sscanf para analizar los números de la cadena en dobles, así:

// char* expression; double value = 0; sscanf(expression, "%lf", &value);

Esto funciona muy bien, pero luego me gustaría continuar analizando la cadena a través de medios convencionales. Necesito saber cuántos caracteres ha sido analizado por sscanf para poder reanudar mi análisis manual desde el nuevo desplazamiento.

Obviamente, la forma más sencilla sería calcular de algún modo el número de caracteres que analiza sscanf , pero si no hay una forma sencilla de hacerlo, estoy abierto a opciones alternativas de doble análisis. Sin embargo, actualmente estoy usando sscanf porque es rápido, simple y legible. De cualquier manera, solo necesito una manera de evaluar el doble y continuar analizándolo.


int i, j, k; char s[20]; if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) ...something went wrong...

La variable k contiene el recuento de caracteres hasta el punto donde se exploró el final del entero almacenado en j .

Tenga en cuenta que el %n no se cuenta en las conversiones correctas. Puede usar %n varias veces en la cadena de formato si lo necesita.