首页 > 其他分享 >C语言基础入门(小白)三种方法解决幽灵换行符问题

C语言基础入门(小白)三种方法解决幽灵换行符问题

时间:2024-10-24 23:21:51浏览次数:3  
标签:字符 读取 入门 scanf C语言 换行符 输入 getchar

首先,相信很多读者读到题目都会产生一个共同的疑问:什么是幽灵换行符???

        幽灵换行符是指:在C语言中,当用scanf函数时,想要输入几个字符,比如:

当输入‘a’之后按下回车键,运行自动结束,而不是等待输入第二个字符,第二个字符就像幽灵般消失了,这是为什么呢??

        其实,原因很简单,回车键也有对应的字符,即\n,当输入第一个字符‘a’之后按下回车键就相当于将\n通过scanf输入到系统中,顶替了变量b的“位置”,如下图可通过调试+监视验证以上结论:

        那么面对这种幽灵换行符问题,有哪些解决方案呢??

下面笔者给出三种可行的解决方案,如有补充欢迎读者留言!

一. 

        既然\n的值被赋给了b,那不妨再调用一个scanf函数输入变量b,如下代码所示:

#include <stdio.h>
int main()

{
    char a, b;
    scanf("%c%c", &a,&b);
    scanf("%c", &b);//再次输入变量b
    printf("x = %d, ch = %d", a, b);
    return 0;
}

运行结果如下图:

x,ch读取的是a 和 b 的ASCII值,因为printf打印的是%d。

二.

        既然\n的值顶替了b的值,那么我们可以利用scanf函数的特性,利用空格解决幽灵换行符的问题。如下代码:

#include <stdio.h>
int main() {
    // 读取输入的字符
    char char1, char2;
    scanf("%c", &char1);
    scanf(" %c", &char2);//%c之前添加一个空格,将\n输入到空格中
    printf("x = %d, ch = %d", char1, char2);

    return 0;
}

运行结果如下图:

三. 

利用getchar()解决幽灵换行符问题。

首先我们先认识一下getchar函数:

通过cplusplus网站查找getchar函数:

(英文版)

(中文版)

简单来说,getchar函数就是取一个字符,getchar和键盘之间有一个输入缓冲区,键盘上敲下的字符会被放到输入缓冲区中,然后getchar从输入缓冲区中“拿”字符,如图:

因此我们可以利用getchar将输入的\n取走

#include <stdio.h>

int main()

{

char x, ch;

// 读取第一个字符

x = getchar();

// 读取并丢弃换行符

getchar();

// 读取第二个字符

ch = getchar();

// 输出结果

printf("x = %d, ch = %d\n", (int)x, (int)ch);

return 0;

}

解释:

  1. getchar() 用于从标准输入读取一个字符。
  2. 第一次调用 getchar() 读取第一个字符(例如 'A')。
  3. 第二次调用 getchar() 读取并丢弃换行符。
  4. 第三次调用 getchar() 读取第二个字符(例如 'B')。
  5. 使用 printf() 输出两个字符的 ASCII 值。

输入输出样例:

或者在二.的基础上使用getchar,代码如下所示:

#include <stdio.h>
int main() {
    // 读取输入的字符
    char char1, char2;
    scanf("%c", &char1);
    getchar();
    scanf("%c", &char2);//此处不用空格
    printf("x = %d, ch = %d", char1, char2);

    return 0;
}

运行结果如下图:

也就是说,getchar()作用就相当于空格的作用了。

以上是笔者分享的三个解决幽灵换行符的方案,如有改进和补充,欢迎读者留言讨论。

标签:字符,读取,入门,scanf,C语言,换行符,输入,getchar
From: https://blog.csdn.net/hjx1235/article/details/143191589

相关文章

  • (神经网络和卷积入门)Pytorch小土堆跟练代码(第7天)
    本系列为跟练小土堆每集代码,然后进入李宏毅机器学习教程。在系列中会敲完所有视频中代码,并且在注释详细写出感悟和易错点。欢迎大家一起交流!最前面的软件安装和环境配置部分,可以移步我的另一个帖子一、神经网络'主要在torch.nn里''首先学的是骨架container''Module,所......
  • 电赛入门之硬件基本电路
    刚上手可以跟着一起做一些小的电路模块,逐步了解各个名词。初学阶段可以不用掌握电路的设计计算,会抄就行,其实抄的多了之后自然就会了。硬件的电路基础框架来来回回就是那些电路的拼接一、放大电路放大电路的物理原理就是初中学的分压电路,更简单来说倍数就是一个比值。而由于......
  • 电赛入门之硬件焊接
    焊接是每个电赛选手必备的功底,电赛四天三夜时间紧任务重,一遍焊成率一定是非常重要的技能。毕竟你也不想因为虚焊和失误导致查板子查一晚上吧(泪)。在学习过程中你肯定会查出来自己各种各样哭笑不得的错误,比如说芯片引脚忘焊,二极管焊反,不小心把信号线接了地、电源线断了.....不......
  • 【粉丝福利社】R语言统计分析与可视化从入门到精通
    标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度......
  • 刷c语言练习题12(牛客网)
    1、在上下文和头文件正常的情况下,以下代码输出的值是:12345678910111213int x = 4;void incre() {    static int x = 1;    x *= x + 1;    printf("%d", x);}int _tmain(int argc, _TCHAR *argv[]) {    int i;......
  • JS-基础入门
    JavaScript入门JavaScript是解释性的弱类型编程语言解释性:逐行解释,逐行执行弱类型:不区分变量的数据类型JS的组成一般认为浏览器中JavaScript由三部分组成ECMAScript:基础语法由ECMA(原欧洲计算机制造商协会)进行标准化的一门编程语言,主要规定了像变量,数据类型,......
  • 关于C语言指针类型的总结
    前言我个人将目前在C语言中所遇到的指针归类为8种,至于为何写第九点,是因为我个人认为第九点极容易与第五点混淆,故总结如下:1.普通指针普通指针即最常见的如:int*、char*等甚至于也可将一个数组如arr[5]的数组名arr看作是指针类型(因为指针本质上就是地址,而arr是该数......
  • 零基础C语言入门第四课——分支(上)
    文章目录开篇一、if语句1.1if1.2else1.3分支中包含多条语句1.4嵌套if开篇本篇文章还没写完,后面会继续修改编辑,把分支的笔记整合到一起,大家可以先收藏,后面就可以看到完整版的笔记了前面我们说过,C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、......
  • 英飞凌AURIX SafeTpack配置入门
       1024程序员节日快乐!!!Hitex按照ISO26262标准作为安全要素开发,系统需要根据不同ASIL等级的要求,针对不同比例的单点故障(SPF)和潜在故障(LF)进行检测,为英飞凌AURIX系列芯片的功能安全提供解决方案。文章按照Hitex提供的基于EBTresos工具用于模块自定义配置SafeTpack开发的......
  • [初识C语言]初识十进制、八进制以及十六进制之间的转换
     序言:本文面对的对象是C语言的初学者,我将会以最简单的方式来让大家快速了解十进制、八进制以及十六进制之间的转换。十进制的转换:十进制转换为八进制:首先我们学习:%o是printf函数中用于输出一个整数的八进制表示的格式说明符下面以十进制的整数10转换为八进制的整......