我可以è在源代码中插入字符,但是在程序的输出中不能正确显示该字符;Þ角色出现在它的位置。
该èASCII字符扩展对应的138。
将è在Unicode字符相匹配的232号码。
将Þ在ASCII字符扩展对应的232号码。
将Þ在Unicode字符相匹配的222号码。
通过调试器,可能会注意到编译器è使用数字232进行转换,并将整数转换138为字符Š(行制表集),而在输出中,字符数232表示为Þ,而字符数138表示为è。
幕后发生了什么?
样例代码:
#include <stdio.h>
int main (void)
{
unsigned char a = 'è';
unsigned char b = 138;
printf ("Char a:% c \ n", a);
printf ("Char a:% d \ n \ n", a);
printf ("Char b:% c …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
#include <stdio.h>
int main(void) {
int n;
fprintf(stdout, "Hello%n World\n", &n);
fprintf(stdout, "n: %d\n", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
Hellon: 0
Run Code Online (Sandbox Code Playgroud)
fprintf格式说明符"%n"不起作用?ISO/IEC 9899:201x C11 - 7.21.6.1 - fprintf功能
转换说明符及其含义是:
(......)
%n参数应该是一个指向有符号整数的指针,其中写入到目前为止通过调用fprintf写入输出流的字符数.没有参数被转换,但是消耗了一个参数.如果转换规范包括任何标志,字段宽度或精度,则行为未定义....
(......)
这是我在Code :: Blocks上使用的编译器版本:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev
0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --bu
ild=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysr
oot=/c/mingw810/x86_64-810-posix-seh-rt_v6-rev0/mingw64 --enable-shared --enable
-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdc
xx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-
lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --
enable-version-specific-runtime-libs --disable-libstdcxx-pch …Run Code Online (Sandbox Code Playgroud)