1. 回车符是 \r 吗?
是的。
在计算机中:
\r 表示 回车(Carriage Return),ASCII 码为 0x0D,作用是把光标移到当前行的行首,但不换到下一行。
\n 表示 换行(Line Feed),ASCII 码为 0x0A,作用是把光标移到下一行,但列位置不变。
2. Windows 与 Linux 的换行区别
Windows:用 \r\n 表示新行。
历史原因:早期电传打字机,回车(回到行首)和换行(纸往上滚一行)是两个机械动作。
Linux / Unix / macOS(现在):用 \n 表示新行。
Classic Mac OS(旧版):用 \r 表示新行。
3. 为什么程序运行只需按回车就可以运行?
在终端里,当你按下 Enter(Return) 键时,终端程序会把它转换成当前操作系统对应的换行符:
在 Windows 下,按 Enter → 发送 \r\n
在 Linux/macOS 下,按 Enter → 发送 \n
C 语言的输入函数(如 scanf、fgets)在 文本模式 打开 stdin 时,会自动把 \r\n 转换成 \n,所以你在代码里判断 \n 即可跨平台工作。
因此,不管实际终端发送的是 \r\n 还是 \n,程序里读到的都是 \n。
4. 为什么 scanf("%d\n", &num) 输入数字后还要输入其他内容才结束?
这是你问题中最关键的部分。
原因:scanf 格式字符串中的 \n 并不表示“等待用户按下回车”,而是表示 “匹配并消耗连续的空白字符(空格、制表、换行)”。
具体过程如下:
%d 读取一个整数,遇到第一个空白字符停止。
然后 \n 让 scanf 继续读取并丢弃后面所有的空白字符(包括你输入数字后按的回车产生的 \n)。
因为 \n 在格式串中意味着 “匹配任意多个空白字符”,所以 scanf 会一直读到 非空白字符 出现才停止。
但 scanf 不会消费那个非空白字符,它会留在输入缓冲区里。
所以现象是:
输入数字,回车,程序没反应,因为它还在等更多输入(直到你输入一个非空白字符,它才结束 \n 的匹配阶段)。