我是 C 菜鸟,尝试使用write()函数来显示整数。
这是我的代码:
int n = 7;
write(1, &n, 4);
Run Code Online (Sandbox Code Playgroud)
我想显示7,但是当我设置为一个大数字时,程序不显示任何内容或其他奇怪的字符n。
我缺少什么?
Eri*_*hil 10
类似的对象int在内存中用不同的位表示。该write例程将这些内存位准确地传输到其目的地。
终端并非设计用于显示任意内存位。它们不会将这些位解释为一个int或其他对象,然后显示该解释。一般来说,我们向终端传输字符。更具体地说,我们发送代表字符的代码。终端被设计为接收这些代码并显示小文字图片(字符、字形、表情符号等)。
要使终端显示 \xe2\x80\x9c7\xe2\x80\x9d,我们需要向其发送 \xe2\x80\x9c7\xe2\x80\x9d 的代码。字符的通用代码系统是 ASCII(美国信息交换标准代码)。\xe2\x80\x9c7\xe2\x80\x9d 的 ASCII 代码是 55。因此,如果您这样做:
\n\nchar x = 55;\nwrite(1, &x, 1);\nRun Code Online (Sandbox Code Playgroud)\n\n如果使用 ASCII,终端将在其显示屏上绘制 \xe2\x80\x9c7\xe2\x80\x9d。
\n\nwrite用于显示int值供人类阅读的错误例程也是如此。相反,您通常使用printf,如下所示:
printf("%d", n);\nRun Code Online (Sandbox Code Playgroud)\n\nin代表.f 它检查表示值的位,并将表示的值格式化为供人类阅读的字符,然后将这些字符写入标准输出。printfformattedn
如果您想使用write将字符传输到终端,您可以使用sprintf只获取格式部分printf而不获取打印部分。对于初学者来说,这段代码可以工作:
char buffer[80]; // Make space for sprintf to work in.\nint LengthUsed = sprintf(buffer, "%d", n); // Format n in decimal.\nwrite(1, buffer, LengthUsed); // Write the characters.\nRun Code Online (Sandbox Code Playgroud)\n\n(更复杂的代码将使缓冲区大小适应所需的大小sprintf。)