C字符输出:一个换行符引发的“失踪案”

如何在C中输出一个字符

前提概要

先别笑,说不定下一个翻车的就是你!

来,先看这道"送分题":程序先读入一个数字,再读入一个字符,最后把它们依次打印出来。

如果你是个刚上路的小白,或者很久没碰这块内容的老手,十有八九会写出下面这版"经典翻车代码":

c 复制代码
#include <stdio.h>
int main(){
    int n;
    char f;
    scanf("%d" ,&n);
    scanf("%c" ,&f);
    printf("%d %c", n, f);
    return 0;
}

跑起来你就会惊讶地发现:那个字符好像人间蒸发了一样,程序根本没等你输入第二个值,就"嗖"地一下跑完了。于是你急了,开始在 %c 和 %s 之间反复横跳,结果越改越离谱,比如又憋出了这份"进阶翻车套餐":

c 复制代码
#include <stdio.h>
int main(){
    int n;
    char f;
    scanf("%d" ,&n);
    scanf("%s" ,&f);
    printf("%d %s", n, f);
    return 0;
}

好家伙,这次更狠,字符没救回来,反而可能把编译器都给整不会了。

打住!先别急着砸键盘,今天的任务就是把这口陈年老坑填得平平整整!

方法一:坑人的 %c

先说结论:问题的锅,要甩给缓冲区里那个"赖着不走"的换行符 \n。

你用 scanf("%d", &n) 输入完数字后,顺手敲下的那个回车键,会留下一个换行符躺在缓冲区里。等轮到 scanf("%c", &f) 上场时,它二话不说就把这个换行符捡走了------所以你以为字符消失了,其实是换行符冒充字符,抢先一步"上车"了。

解决办法简单到令人发指:在 %c 前面加一个空格,让它先把换行符这种"无关人员"清理掉,再正儿八经地接待真正的字符。

c 复制代码
#include <stdio.h>
int main(){
    int n;
    char f;
    scanf("%d" ,&n);
    scanf(" %c" ,&f);
    printf("%d %c", n, f);
    return 0;
}

方法二:%s 老哥来救场

如果你实在不想跟 %c 的小脾气较劲,干脆把"字符"升级成"字符串",请 %s 老哥出场。定义一个字符数组当缓冲区,%s 会自动跳过前面的空白字符,换行符想插队?门都没有。

c 复制代码
#include <stdio.h>
int main(){
    int n;
    char f[10];
    scanf("%d" ,&n);
    scanf("%s" ,&f);
    printf("%d %s", n, f);
    return 0;
}

方法三:买全家桶,只吃第一块鸡腿

第三种玩法有点"买全家桶只吃一块鸡腿"的味道:先用 %s 把整个字符串稳稳接住,再用 f[0] 把第一个字符捞出来,按 %c 打印。思路干净利落,就是稍微多占那么一丁点内存。

c 复制代码
#include <stdio.h>
int main(){
    int n;
    char f[10];
    scanf("%d" ,&n);
    scanf("%s" ,&f);
    printf("%d %c", n, f[0]);
    return 0;
}

总结:下次别再慌

  • 只想读一个字符:记住在 %c 前面加个空格------scanf(" %c", &ch);
  • 想稳稳接住输入:直接上 %s 字符串;
  • 想只要字符串里的第一个字符:f[0] 一手交钱一手交货。

以后再遇到字符"神秘消失"、输出乱码,先深呼吸,多半是缓冲区里的换行符又在搞事情。填坑愉快,祝你的字符不再迷路!

相关推荐
我命由我1234541 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
http阿拉丁神猫5 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
不会就选b6 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Pniubi9 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知10 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工10 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留11 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu11 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
益莱储中国12 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php