El estándar C17 (N2176) establece: "La función fputc devuelve el carácter escrito" (7.21.7.3) si no hay error de escritura.
Pero en el contexto de
int c ; // ... later, c is assigned an "interesting" value ... int k = fputc ( c , stdout ) ;es
k == c || k == EOF siempre true ? Es decir, siempre que fputc no devuelva EOF , ¿está garantizado que devolverá c ? Dicho de una tercera manera, ¿ fputc puede escribir un carácter diferente a uno igual a su primer argumento?
Por ejemplo, si solicito la salida del signo de dólar (no se garantiza que esté en los juegos de caracteres fuente o de ejecución, AFAICT), podría '\u0024' != fputc('\u0024', stdout) . Tal vez el programa genere un símbolo de moneda local, en su lugar.
La pregunta es
En C, ¿cuándo puede
fputcdevolver algo que no sea su primer argumento?
Las respuestas parciales hasta ahora (2021-10-20) parecen ser:
fputc ,(unsigned char) c != c Supongamos que (unsigned char) c == c , pero (unsigned char) c no coincide con un carácter en el conjunto de caracteres de ejecución. ¿Se le permite a fputc escribir algún otro carácter en su lugar?
Por ejemplo , suponga que c == (unsigned char) '\u0024' (signo de dólar ASCII) no existe en el conjunto de caracteres de ejecución (porque el conjunto de caracteres de ejecución no es ASCII). ¿Puede fputc escribir, por ejemplo, otro símbolo de moneda en su lugar (o algún carácter arbitrario)?
es
k == c || k == EOFsiempre es cierto?
Normalmente sí, pero no.
Con fputc ( c , stdout ) , c se convierte en un unsigned char y eso se escribe. Es ese valor o EOF que se devuelve.
En su lugar, espere k == (unsigned char) c || k == EOF .
La función
fputcescribe el carácter especificado porc(convertido en ununsigned char) en el flujo de salida...
Devoluciones: La funciónfputcdevuelve el carácter escrito. Si ocurre un error de escritura, se establece el indicador de error para la secuencia yfputcdevuelveEOF. C17dr § 7.21.7.3 2-3
Un ejemplo algo no tan raro es cuando ch se asigna desde un char que está firmado y con un valor inferior a 0. Se espera que el valor de retorno de la función sea [0...UCHAR_MAX] o EOF .
Ejemplo
char ch = -96; printf("%d %d %d\n", SCHAR_MIN, ch, fputc(ch, stdout));Producción
�-128 -96 160Tal vez el programa genere un símbolo de moneda local, en su lugar.
Con fputc('\u0024', stdout) , igual que fputc(0x24, stdout) y fputc(36, stdout) , el símbolo que se ve es específico de la implementación. C no especifica que se use ASCII, incluso si es omnipresente. C no especifica la fuente ni las formas de las representaciones de caracteres. Aún así, probablemente será $ .
Sí, fputc siempre devuelve EOF o el carácter escrito.
Según la página de cppreference.com en fputc :
Valor de retorno
En caso de éxito, devuelve el carácter escrito.
En caso de falla, devuelveEOFy establece el indicador de error (verferror()) en la transmisión.
Y del estándar C17 (7.21.7.3/2-3, N2310 ):
Descripción
La funciónfputcescribe el carácter especificado por c (convertido en ununsigned char) en el flujo de salida al que apunta flujo...Devoluciones
La funciónfputcdevuelve el carácter escrito. Si ocurre un error de escritura, se establece el indicador de error para la secuencia yfputcdevuelveEOF.