使用%C,%S,%ls,%lc

时间:2017-12-14 23:00:57

标签: c printf

我正在搜索printf使用标志时返回-1的示例 %C%s%ls%lc。甚至是背后的逻辑。

我在维基百科上查看了UTF-8以及所有"糟糕的utf-8序列"但即使那些printf也没有返回-1。

所以我尝试了以下代码 [NEW TRY]

#import <stdlib.h>
#import <stdio.h>
int main() {
  // I ADDED THIS
  locale = setlocale(LC_ALL, "");
  int result = printf("%lc", 0xff00);
  printf("%d", result);
  return 0;
}

结果:

＀
4

编辑2:我在unix环境中

1 个答案:

答案 0 :(得分:1)

小例子:

#import <stdlib.h>
#import <stdio.h>
int main() {
  char* garbage = (char*)malloc(2);
  garbage[0] = 0xff;
  garbage[1] = 0x00;
  int result = printf("%ls", garbage);
  free(garbage);
  printf("%d", result);
  return 0;
}

ff00不是有效的unicode序列。需要它的逻辑是,并非所有任意字节序列都是有效的unicode字符串。 Unicode规范说ff00无效。因此,当被要求打印时,printf返回-1。

编辑:您也可以尝试使用wchar_t并分别使用0xff00和0x0000作为第一个和第二个短路(或0xffff:0x0000等)。 printf仍将返回-1。