什么是 sprintf 的编码错误,会返回 -1?
在我的机器上,使用 "%ls" 格式化字符串时,无法处理 0xFFFF,这显然是一个编码错误。
char buf[42];
wchar_t s[] = { 0xFFFF,49,50,51,0 };
int i = snprintf(buf, sizeof buf, "<%ls>", s);
printf("%d\n", i);
输出
-1
以下代码返回-1,但原因并不是由于编码错误,而是由于病态格式所致。
#include <stdio.h>
int main() {
size_t n = 0xFFFFFFFFLLu + 1;
char *fmt = malloc(n);
if (fmt == NULL) {
puts("OOM");
return -42;
}
memset(fmt, 'x', n);
fmt[n - 1] = '\0';
char buf[42];
int i = snprintf(buf, sizeof buf, fmt);
printf("%d %x\n", i, (unsigned) i);
free(fmt);
return 7;
}
输出
-1 ffffffff
当传递一个太大的大小时,即使 snprintf()
只需要6个字节,我仍然得到了一个出乎意料的-1。
char buf[42];
int i = snprintf(buf, 4299195472, "Hello");
printf("%d\n", i);
输出
-1
我想到了一个简短的例子,会在使用*fprintf()
将内容输出至stdout
时返回-1,这是由于方向冲突所导致的。
#include <wchar.h>
#include <stdio.h>
int main() {
int w = wprintf(L"Hello wide world\n");
wprintf(L"%d\n", w);
int s = printf("Hello world\n");
wprintf(L"%d\n", s);
}
输出
Hello wide world
17
-1