scanf中的/n

本文解析了C语言中scanf函数的工作原理,特别是在处理空白字符及换行符方面的行为,并提供了使用示例,同时讨论了scanf与gets等其他输入例程混用可能带来的问题。
  1. /n在scanf中不表示等待换行符,而是读取并放弃连续的空白字符   
  2. 如:  
  3. #include<stdio.h>       
  4. int main(void)   
  5. {   
  6.     int n;   
  7.     scanf("%d/n",&n);// 需要输入两个数字,反正第二个不能输入空格或者直接回车,也就是说让scanf读到非空白字符为止   
  8.     printf("you typed %d/n",n);   
  9. }   
  10.   
  11. scanf函数是设计来读取只有格式的输入的,而在读取键盘那输入的时候,你所得到的往往并不是你所想要的,“自由格式”意味着scanf在处理换行符的时候跟其他的空白一样,格式“%d%d%d”既可读   
  12.   
  13. 入 1 2 3   
  14. 又可读入   
  15. 1   
  16. 2   
  17. 3   
  18. .................   
  19. 作为一般规则,不能混用scanf和gets或任何其他的输入例程的调用,scanf对换行符的特殊处理几乎一定会带来问题,要们就用scanf处理所有的输入,要么干脆不用,如:  
  20. #include<stdio.h>       
  21. int main(void)   
  22. {   
  23.     int n;   
  24.     char str[80];   
  25.     printf("Enter a number:");   
  26.     scanf("%d",&n);   
  27.     printf("Enter a string");   
  28.     gets(str);   
  29.     printf("you typed %d and %s/n",n,str);   
  30. }   
  31. 上面当向程序中输入   
  32. 12   
  33. string  
  34. scanf会读取12,但却不会读到紧接其后的换行符,换行符会保留在输入流中,然后被gets()读取,后者会读入一个空行,而第二行的string则根本不会被读取   
  35. 当然你这样输入会改变下如:12 string    
  36. 不过最后建议不样把两个输入函数混在一起使用,避免bug的产生  
你问得非常好!我们来彻底搞清楚这个问题: > **“为什么在 `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()` 清除,就会导致后续字符读取出错。 这不是“变错了”,而是“没被处理”,需要你主动清理! 如果你还有疑问,我可以画流程图或用更多例子帮你理解 😊
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值