如何在C中输出一个字符
-
- 前提概要
- [方法一:坑人的 %c](#方法一:坑人的 %c)
- [方法二:%s 老哥来救场](#方法二:%s 老哥来救场)
- 方法三:买全家桶,只吃第一块鸡腿
- 总结:下次别再慌
前提概要
先别笑,说不定下一个翻车的就是你!
来,先看这道"送分题":程序先读入一个数字,再读入一个字符,最后把它们依次打印出来。
如果你是个刚上路的小白,或者很久没碰这块内容的老手,十有八九会写出下面这版"经典翻车代码":
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]一手交钱一手交货。
以后再遇到字符"神秘消失"、输出乱码,先深呼吸,多半是缓冲区里的换行符又在搞事情。填坑愉快,祝你的字符不再迷路!