String Format Specifiers reclamaciones documento de Apple,¿Por qué NSString y NSLog parecen manejar% C y% lc (y% S y% ls) de manera diferente?
Los especificadores de formato compatible con los métodos de formato NSString y funciones de formato CFString seguir el IEEE printf specification; ... También puede usar estos especificadores de formato con la función NSLog.
Pero, mientras que la especificación define printf
%C
como equivalente de %lc
y %S
como equivalente de %ls
, solamente %C
y %S
parecen funcionar correctamente con NSLog
y +[NSString stringWithFormat:]
.
Por ejemplo, considere el siguiente código:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
unichar str[3];
str[0] = 63743;
str[1] = 33;
str[2] = (unichar)NULL;
NSLog(@"NSLog");
NSLog(@"%%S: %S", str);
NSLog(@"%%ls: %ls", str);
NSLog(@"%%C: %C", str[0]);
NSLog(@"%%lc: %lc", str[0]);
NSLog(@"\n");
NSLog(@"+[NSString stringWithFormat:]");
NSLog(@"%%S: %@", [NSString stringWithFormat:@"%S", str]);
NSLog(@"%%ls: %@", [NSString stringWithFormat:@"%ls", str]);
NSLog(@"%%C: %@", [NSString stringWithFormat:@"%C", str[0]]);
NSLog(@"%%lc: %@", [NSString stringWithFormat:@"%lc", str[0]]);
[pool drain];
return 0;
}
Dada la especificación printf
, esperaría que cada uno de los pares anteriores para imprimir la misma cosa. Sin embargo, cuando ejecuto el código, me sale el siguiente resultado:
2009-03-20 17:00:13.363 UnicharFormatSpecifierTest[48127:10b] NSLog
2009-03-20 17:00:13.365 UnicharFormatSpecifierTest[48127:10b] %S: !
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯!
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %C:
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b] %lc:
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b]
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] +[NSString stringWithFormat:]
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] %S: !
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯!
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %C:
2009-03-20 17:00:13.370 UnicharFormatSpecifierTest[48127:10b] %lc:
estoy haciendo algo mal, o se trata de un error en el código de Apple?
Gracias; ¡Eso tiene mucho sentido! Creo que caracterizaría esto como un error en la documentación, porque los métodos de formateo NSString claramente no siguen la especificación printf en este caso. ¿Eso parece una evaluación justa? –
Error moderado; debería decir algo como "..., con un par de variaciones", y marcarlos en la tabla.El documento describe correctamente las interpretaciones de CF/Cocoa en la tabla, aunque no las señala como diferentes de las definiciones de printf. –
Así es como yo lo caracterizaría también. ¡Gracias de nuevo por la ayuda! –