C utilizando scanf () para | cadena delimitada

Quiero ingresar unas pocas cadenas y luego dos enteros. Mientras que las cadenas están separadas por ‘|’, los enteros se mantienen separados por ‘.’.

Mirando a mi alrededor en línea he visto algún tipo de syntax que involucra [^] . Estoy usando esto pero no funciona en absoluto. ¿Alguien puede indicar qué debo estar haciendo y por qué lo que hago está mal?

 sscanf(str, "%s[^|],%s[^|],%s[^|],%i[^|],%i[^.]", …); 

La syntax es, en el mejor de los casos, arcana: sugeriría utilizar un enfoque diferente, como strtok() , o analizar las funciones de manejo de cadenas strchr() etc.

Sin embargo, lo primero que debe darse cuenta es que el especificador de formato %[^] (un ‘conjunto de escaneo’ en la jerga, documentado por POSIX scanf() entre muchos otros lugares) solo extrae campos de cadena. convertir las cadenas extraídas en un entero si eso es lo que representan.

En segundo lugar, todavía tiene que incluir el delimitador como un carácter de coincidencia literal fuera del especificador de formato; ha separado los especificadores de formato con comas donde | están en el flujo de entrada.

Considera lo siguiente:

 #include  int main() { char a[32] ; char b[32] ; char c[32] ; char istr[32] ; // Buffer for string representation of i int i ; int j ; // j can be converted directly as it is at the end. // Example string char str[] = "fieldA|fieldB|fieldC|15.27" ; int converted = sscanf( str, "%[^|]|%[^|]|%[^|]|%[^.].%i", a, b, c, istr, &j ) ; // Check istr[] has a field before converting if( converted == 5 ) { sscanf( istr, "%i", &i) ; printf( "%s, %s %s, %d, %d\n", a, b, c, i, j ) ; } else { printf( "Fail - %d fields converted\n", converted ) ; } return 0 ; } 

Debe usar s construcción [] o s construcción s , pero no ambas, y su cadena de formato debe incluir los separadores.

Así que deberías escribir algo como:

 sscanf(str, "%[^|]|%[^|]|...",...) 

Esto parece funcionar …

 #include  main() { char x[32] = "abc|def|123.456."; char y[20]; char z[20]; int i =0; int j =0; sscanf(x,"%[^|]|%[^|]|%d.%d.",y,z,&i,&j); fprintf(stdout,"1:%s 2:%s 3:%d 4:%d\n",y,z,i,j); }