fscanf con clases de personajes

Digamos que tengo un archivo dog.txt

The quick brown fox jumps over the lazy dog. 

Puedo leer el archivo como este

 # include  int main(){ char str[10]; FILE *fp; fp = fopen("dog.txt", "r"); fscanf(fp, "%[ABCDEFGHIJKLMNOPQRSTUVWXYZ]", str); printf("%s\n", str); return 0; } 

y el progtwig dará salida a T Sin embargo, en lugar de enumerar todas las letras, ¿puedo utilizar las Clases de caracteres POSIX, algo como [:upper:] ?

No, no hay una forma portátil de hacerlo. Algunas implementaciones le permiten usar rangos de caracteres como %[AZ] , pero eso no está garantizado por el estándar C. C99 §7.19.6.2 / 12 dice esto sobre el [ especificador de conversión (énfasis agregado):

El especificador de conversión incluye todos los caracteres subsiguientes en la cadena de format , hasta e incluyendo el corchete derecho correspondiente ( ] ). Los caracteres entre los corchetes (la lista de escaneo ) componen el escáner, a menos que el carácter después del corchete izquierdo sea circunflejo ( ^ ), en cuyo caso el escáner contiene todos los caracteres que no aparecen en la lista de escaneo entre el circunflejo y el corchete derecho. Si el especificador de conversión comienza con [] o [^] , el carácter del corchete derecho se encuentra en la lista de exploración y el siguiente carácter del corchete derecho siguiente es el corchete derecho que termina la especificación; De lo contrario, el primer carácter de corchete derecho siguiente es el que finaliza la especificación. Si un carácter está en la lista de exploración y no es el primero, ni el segundo donde el primer carácter es un ^ , ni el último carácter, el comportamiento está definido por la implementación.

La descripción de POSIX.1-2008 tiene una redacción casi idéntica (e incluso difiere de la norma ISO C en caso de conflicto accidental), por lo que no hay garantías adicionales en este caso cuando se usa un sistema POSIX.

No, no puedes. Esto es lo que puedes hacer con [] :

La especificación de conversión incluye todos los bytes subsiguientes en la cadena de formato hasta e incluyendo el (‘ ] ‘ correspondiente. Los bytes entre los corchetes (la lista de escaneo ) comprenden el escáner, a menos que el byte después de sea un (‘ ^ ‘), en cuyo caso el escáner contiene todos los bytes que no aparecen en la lista de escaneo entre el y el corchete . Si la especificación de conversión comienza con ” [] ” o ” [^] “, el se incluye en la lista de exploración y el siguiente es el correspondiente que termina la especificación de conversión; de lo contrario, el primer es el que finaliza la especificación de conversión. Si un ‘ - ‘ está en la lista de exploración y no es el primer carácter, ni el segundo donde el primer carácter es un ‘ ^ ‘, ni el último carácter, el comportamiento está definido por la implementación.

( POSIX estándar para scanf . El estándar C tiene una redacción similar, vea la respuesta de Adam Rosenfield).

Por lo tanto, dependiendo de la implementación, podría hacer fscanf(fp, "%[AZ]", str) , pero no hay garantía de que eso funcione en ningún sistema POSIX. En cualquier caso, [:upper:] es lo mismo que [:epru] .

Prueba esto:

 fscanf(fp, "%[AZ]", str);