C语言细节——献给入门者(一)

主题  输入输出需要注意的细节

首先我们要知道大致有scanf(),printf(),getchar(),putchar(),gets(),puts()这几种输入方式。

1⃣️.scanf()&gets()

首先看个最普通的例子:

char str[20];

scanf(“%s”,str);

当我们输入helloworld,此时str为“helloworld”

但是当我们输入hello world,此时str为“hello”

原因是scanf输入字符串时遇到空格和回车就停止读入

————

对比着看gets()

gets(str);

当我们输入helloworld,此时str为“helloworld”

但是当我们输入hello world,此时str为“hello world”

说明gets遇到空格依然把空格当成字符读入,而不是停止,但是遇到回车依然会停止读入

2⃣️.printf()

printf()大约只需要注意输出的对应,以及一下这两种情况

1.printf(“%d ”,123,456);

这种情况下会输出123,原因是printf函数参数的压栈顺序是从右到左,也就是456先压入栈,123在456上面,而取出参数时又是从栈顶开始出,所以输出为123

2.printf(“%d”,(123,456));

这种情况下输出456,原因是小括号里面表示一条语句,而返回值是最右边的数,所以这边的参数是456,123根本没有传进printf函数。

此外再讲一些printf输出格式(此部分借鉴他人,不打字了):

(整数格式)

int a=1234;

printf("a=%d\n",a);    //a=1234

printf("a=%2d\n",a);   //a=1234    超过2位,按实际输出

printf("a=%6d\n",a);   //a=  1234  不足6位,右对齐

printf("a=%06d\n",a);  //a=001234  不足6位,前面补0

printf("a=%-6d\n",a);  //a=1234    '-'左对齐

(浮点数格式)

float m=8888.8888;     //float 单精度型浮点数 有效位数是6位或7位,根据不同的浮点数会有不同

float m1=8888.8888f;    //在后面加上f或F,编译警告:truncation from'const double'to 'float'

//编译器默认浮点数为double

float m2=8888.888f;

double n=8888.8888;

double n1=8888888888.88888888;  //double 双精度型浮点数 有效位数是15位

printf("m=%f\n m1=%f\n m2=%f\n n=%lf\n n1=%f\n",m,m1,m2,n,n1); // m=8888.888672

// m1=8888.888672     m2=8888.887695

// n=8888.888800 n1=8888888888.888889

//%f的默认输出小数位数就是6位不管有没有l

/*printf的%f说明符的确既可以输出float型又可以输出 double型。 根据"默认参数提升"规则(在printf这样的函数的

可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到

双精度数。严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。*/

printf("m4=%4.2f\n",m);

//宽度总共4位,小数两位,小数点一位,整数一位,这里

//整数超过宽度规定,按实际整数位输出

printf("m5=%9.6f\n",m);   //浮点数小数部分不足6位,右对齐

printf("m6=%9.2f\n",m);   //整数部分不足6位,右对齐;小数部分超过2位,四舍五入

char c[20]="Hello,world!";

printf("c=%s\n",c);

printf("c=%6.9s\n",c);

//c=Hello,wor  6.9s表示输出一个长度长度不小于6且不大于9

//的字符串。若大于9, 则第9个字符以后的内容将被删除。

3⃣️.getchar()

getchar();是读取一个字符。包括空格,回车;

比较大的作用是当需要输入一个数字之后有需要输入一个字符串的时候;

如:

scanf(“%d”,&num);

scanf(“%s”,str);//或者gets(str);

此时输入

123 hello

或者

123

hello

字符串读入都是会出错的,原因是把回车或者空格当成你想要读的字符串读进str了,这个时候我们需要在这两行输入中间夹一个getchar();来吃掉这个回车或者空格以保证str读取正确。

getchar()的使用方法还可以一个一个读入字符;

如:while((ch=getchar())!=EOF)//注这里内部的小括号不能漏,不然ch的值就是getchar()!=EOF的比较返回的真假值了,因为!=优先级大于=,优先级请自己查。

4⃣️.putchar()&puts()

这两个其实没什么好说的,就是一个输出单个字符,一个输出一个字符串,需要注意的是puts()会自动在输出的字符串后面加上一个换行。

以上。

学的不精,望广大网友查错提建议,谢谢~

补充两个(以下是两个学弟写的两段典型的代码):

1.

2.

这两段代码的错误就在于两个连着的scanf("%c",&ch);当第一个读入一个字母后,第二个ch读入了回车;为了避免这种情况,我们有两种办法解决。

一是加个getchar();吃掉回车

二是scanf()里面加个"\n"

所以上面两个代码的改正方法是:

第一个代码在循环里面的scanf("%c",&ch1);这句前面加个getchar();   或者改成scanf("\n%c",&ch1);

第二个代码错在\n的位置,while外面还有一个scanf,之后就有一个回车需要吃掉,所以直接把\n放在前面,scanf("\n%c",&ch1);这样就可以了。

以上。

C语言细节——献给入门者(一)的更多相关文章

  1. C语言细节——献给入门者(三)

    C语言细节——献给入门者(三) >>主题:关于强制类型转换 先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等.当 ...

  2. C语言细节——献给初学者(二)

    C语言细节——献给初学者(二) 主题  循环运用+选择判断 C语言循环有for和while/do...while: 选择判断有:if...else和switch...case 在循环中需要注意搭配br ...

  3. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  4. C语言细节总结笔记

    C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...

  5. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

  6. [转载] C语言细节,写的非常棒!

    这篇文章主要讨论C语言细节问题.在找一份工作的时候,语言细节占的比例非常小,之前看某个贴着讨论,估计语言细节在面试中,占了10%的比重都不到,那为什么还要研究C语言的细节呢,我觉得有三个原因促使我总结 ...

  7. C语言学习从入门到精通书籍,10万读者都认可

    C语言程序设计从入门到精通 10万读者认可的编程图书精粹 零基础自学编程的入门图书 详解C语言编程思想和核心技术 很多初学者,对C语言.c++的概念都是模糊不清的,C语言.c++是什么,能做什么,学的 ...

  8. 学习swift语言的快速入门教程推荐

    随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...

  9. 记录JavaFx中非常重要的细节,入门了也未必知道

    title: 记录JavaFx中非常重要的细节 JavaFx中有一些疑难杂症,或许你以为你掌握了JavaFx,但是也未必知道我所说的这些问题和解决方案,如果有帮助到你的,可以加群最大最活跃的JavaF ...

随机推荐

  1. go gomail

    package main //cmd: go get gopkg.in/gomail.v1 import ( "gopkg.in/gomail.v1" ) func main() ...

  2. 一个关于Delphi XML处理单元的BUG

    使用delphi的XML处理单元 XMLDoc XMLIntf 在获取XML文本内容的时候, 高版本的Delphi会丢失编码描述....在D7上却是正常的, 下面是测试源码: procedure TF ...

  3. Bomb---hdu5934(连通图 缩点)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有n个炸弹,每个炸弹放在(x, y)这个位置,它能炸的范围是以 r 为半径的圆,手动引爆这 ...

  4. 将编码从GB2312转成UTF-8的方法汇总(从前台、程序、数据库)

    这篇文章主要介绍了将编码从GB2312转成UTF-8的方法汇总(从前台.程序.数据库),需要的朋友可以参考下 一个网站如果需要国际化,就需要将编码从GB2312转成UTF-8,其中有很多的问题需要注意 ...

  5. Winform 主窗体更换 构造函数传值

    制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  6. cpp异常详解

    1. 异常介绍 在函数在执行过程中如果碰到对错误的处理可以有两种方式, 1. 返回错误,2. 使用异常. 如果作为函数的调用者想要知道具体的错误信息, 就需要维护一套错误列表, 或者用string类型 ...

  7. winform插件机制学习

    这两天在看自定义控件,原来有太多知识没有掌握.今天看到插件机制,心里突然一亮,这个东西听了不少次,就是不知道是啥回事.这次有幸书里包含一个案例,我就跟着它一步步来.终于知道是什么回事了.这个应该在软件 ...

  8. GAT2.0使用文档(组合接口测试)

    3.2接口用例场景组件 在此之前,大家应该都已经开发完成了一个最简单的接口测试用例,但是之前的接口用例的期望结果是固定值,不能动态的去做对比,有很大局限性.下面开始介绍怎样通过场景组件来动态对测试结果 ...

  9. logback.xml日志配置

    日志先行,日志是程序员的眼睛 控制台输出 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAp ...

  10. 利用angular与后台的交互

    记录的世界是强大的,不管天南海北还是五湖四海,如果利用angular js与后台的交互.angular js 在api上称为是http服务: 下面咱给一个简单的代码看看:简单的利用后台与前端的tab切 ...