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] 一手交钱一手交货。

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

相关推荐
Wang's Blog11 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain12 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67812 小时前
深挖C++:类和对象(中)
开发语言·c++
灿飞屋12 小时前
Rust 编程其实很简单
开发语言·rust
MOONICK14 小时前
QT元数据
开发语言·qt
D e re k ZH15 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
灿飞屋15 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
xiaoye-duck16 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
Zwawa17 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式