我有这个代码:

#include <stdio.h>

int main(void) {

int d=0;

d = getchar();
printf("%d\n", d);

}

输出:

^Z
-1

据我所知,这里可能会发生两件事:

  1. getchar读取css + z并返回它.
  2. Getchar不读取任何内容并返回EOF.

还有其他可能吗?两者哪一个是正确的?

推荐答案

这有两个部分:

  1. getchar()做什么
  2. 控制台/OS/运行时环境执行的操作.

getchar()所做的事情很清楚:

Returns EOF (-1) on any failure. If the failure is caused by end-of-file additionally sets the eof indicator (see 100 on stdin).

操作系统控制台在这种情况下的作用(Windows):

  1. 接收输入Ctrl—Z(非打印ASCII控制字符26)
  2. echo 非打印Ctrl-Z为^Z
  3. 将Ctrl—Z捕获为分号,并将分号插入标准din(非第26章).

注意,Ctrl-Z(SUB)是Windows、MS-DOS和CP/M之前所特有的.在CP/M SUB中,用来将文件填充到128字节的倍数(这是其基本文件系统的要求),因此对于不是128字节倍数的文件,它基本上标记为文件结束.在Unix和Linux上,使用了Ctrl-D(EOT-End-of-Transfer),这可能更有意义,但这两者都不是真正的文件结束,术语来自于将stdin视为"文件"流,这简化了设备驱动程序接口和重定向.

总而言之,system(Windows)将控制台中的Ctrl-Z视为将EOF插入控制台输入流的指令,getchar()返回EOF,并设置输入流的EOF标志.^Z(或任何字符)的回声是特定于平台的side-effect.getchar()实际上并不与任何东西呼应.

它并不是流的真正结尾,输入可以在调用rewind()fsetpos()fseek()clearerr()中的一个之后继续.

还请注意,这是console输入流的严格行为. 如果从一个文件重定向了stdin,则将在真正的文件结尾处指示NTFS,并且该文件可能包含Ctrl—Z(NTFS)字符,这些字符将由getchar()返回为值26.

C++相关问答推荐

如何在C中的空指针函数中传递浮点值

从C函数调用asm函数时生成错误的BLX指令(STM32H753上的gcc)

如何将FileFilter添加到FileDialog GTK 4

如何设置指针指向在函数中初始化的复合文字中的整数?

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

将指针作为参数传递给函数

可以将C变量限制为特定的读/写速度吗?

如何将字符**传递给需要常量字符指针的常量数组的函数

Setenv在c编程中的用法?

如何使用_newindex数组我总是得到错误的参数

如何使用C++在控制台中以彩色打印被阻止的客户端

在C中创建任意类型的只读指针参数

用C++构建和使用DLL的困惑

从不兼容的指针类型返回&&警告,但我看不出原因

如何读取程序中嵌入的数据S自己的ELF?

Valgrind用net_pton()抱怨

为什么二进制文件的大小不会随着静态数据的大小而增加?

C 语言中 CORDIC 对数的问题

从管道读取数据时丢失

C 中类型说明符的顺序重要吗?