scanf中有/n的情况。

现在假设你的缓冲区里有:abcd\n1234\n  (其中\n是回车符)执行:scanf("%s",name);的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止的输入函数。所以执行后,把abcd存到了name中。缓冲区于是变成了 : \n1234\n
如果遇到了:scanf("%d",&number);会忽略先导的空白符。
\n1234\n的时候,如果遇到了:scanf("%c",&sex)  会读取\n。注意这个例外
当执行scanf("%s",name)的时候,要求你从键盘输入,于是你输入了"abc",然后“回车”。缓冲区里自然而然地是:abc\nscanf把abc拿走了,留下了\n,缓冲区里现在就剩下\n于是,下一个scanf ("%c",&sex); 想当然地读取了\n
scanf函数的第一个参数指定了后面变量读取的格式,这样写的话会按照 :数字 回车的格式读取,读到回车之后会继续读下一行,如果缓冲区没有东西scanf就会阻塞在那里,直到用户有输入,以至于有时候会遇到再输入一行才能有返回的情况。
#include<stdio.h>
int main(int argc, char const *argv[]) {
  int s[3];
  char s2;
  scanf("%s",s);
  printf("%s\n",s);
  scanf("%c", &s2);
  printf("%d\n",s2);
  return 0;
}

输入123,输出123 和10.10对应ASCII的换行符。

#include<stdio.h>
int main(int argc, char const *argv[]) {
  int s[3];
  char s2;
  scanf("%s\n",s);
  printf("%s\n",s);
  scanf("%c", &s2);
  printf("%d\n",s2);
  return 0;
}

输入123,输出123和‘A’.

你问得非常好!我们来彻底搞清楚这个问题: > **“为什么在 `scanf` 中输入 `\n` 变错了?”** 其实,**不是 `scanf` 把 `\n` 变错了**,而是: > ✅ `\n`(回车符)根本就没被 `scanf` 读进去 —— 它被“留在了输入缓冲区”! --- ### 🌟先说结论: ```c scanf("%d", &N); ``` 这行代码**只读数字**,读完就停止。当你输入数字后按回车,那个回车产生的 `\n` **不会被 `scanf` 读走**,而是留在输入流里,等着下一个读字符的函数去读它。 --- ### 🔍举个完整例子: 你运行程序,然后输入: ``` 3[Enter] A b[Enter] ``` 计算机看到的是这些字符: ``` '3', '\n', 'A', ' ', 'b', '\n' ``` 现在执行这句: ```c scanf("%d", &N); ``` - `scanf` 看到 `'3'`,知道这是个整数,于是把 `N = 3` - 然后它遇到 `\n`,它说:“我只负责读数字,回车不是数字,我不读!” - 所以 `\n` 还留在输入缓冲区里 👉 此时 `scanf` 结束了,但 `\n` 没被吃掉! --- ### ⚠️接下来如果直接用 `getchar()` 会怎样? ```c char c = getchar(); // 第一次调用 ``` 你以为会读到 `'A'`? ❌ 不对! 它先读的是那个还“卡”在那里的 `\n`! 所以: - 第一次 `getchar()` → 读到 `\n`(回车) - 第二次 → `'A'` - 第三次 → 空格 `' '` 这就导致你少读了一个有效字符,而且多统计了一个“空白”,结果错误! --- ### ✅ 正确做法:手动清除 `\n` 加一句: ```c scanf("%d", &N); // 读数字 getchar(); // 吃掉后面的 \n ``` 这一句 `getchar();` 的作用就是: > 主动从输入中取一个字符,并丢掉 —— 正好用来吃掉那个多余的 `\n` 这样后面再读字符时,就不会被干扰了。 --- ### ❗重要提醒:`\n` 并不是“变错了” - `\n` 没有被修改 - 也没有出错 - 它只是**没有被 `scanf` 处理** - 它仍然“原封不动”地待在输入流里,等待被读取 这就是所谓的“输入缓冲区残留问题”。 --- ### 💡类比理解: 想象你在邮局寄包裹: - `scanf` 是快递员,只拿走写着数字标签的箱子(比如订单号) - 但箱子旁边的便条(`\n`)他不收 - 下一个快递员(`getchar`)来了,以为便条也是东西,就顺手带走了 所以我们得让第一个快递员走之前,自己先把便条扔掉: ```c getchar(); // 扔掉便条(\n) ``` --- ### ✅ 总结一句话: > `scanf("%d", &N);` 不会读取回车符 `\n`,它会把它留在输入缓冲区;如果不手动用 `getchar()` 清除,就会导致后续字符读取出错。 这不是“变错了”,而是“没被处理”,需要你主动清理! 如果你还有疑问,我可以画流程图或用更多例子帮你理解 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值