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. Postgres-enum

    -- 1. rename the enum type you want to change alter type some_enum_type rename to _some_enum_type; - ...

  2. hgrjhgkjh

    #include<stdio.h> int step[5]={13,5,1,4,11}; int sum; int min=999; void ji() {  int i;  int j; ...

  3. Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理

    Linux内核设计第一周 ——从汇编语言出发理解计算机工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 编写songchenning5315.c文件 图2 将c文件汇编成32位机器语言 ...

  4. Metro 页面间跳转报错、打包和安装一个本地的Metro类型应用

    1.模板页面间传值跳转报错误 参照:http://www.cnblogs.com/dagehaoshuang/archive/2012/08/31/2665166.html#2862480 强烈推荐, ...

  5. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件WinForm业务平台

    RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件WinForm业务平台 接上篇: RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组 ...

  6. Scala 环境搭建

    下载安装包 1,)下载java jdk,推荐jdk1.8; 2,)下载scala安装包:http://www.scala-lang.org/; 3,)下载IDE:ide可以选择两种: 3.1,)Sca ...

  7. ligerui_ligerTree_004_对"ligerTree"节点操作

    ligerTree节点操作: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 效果图: 代码: json.txt: [ { text ...

  8. 智能家居常用WiFi模块

    WiFi模块 WiFi模块就是整个系统的控制中心,控制很简单,就是输出一个开关信号控制继电器,而这个模块的核心是WiFi的连接,手机连接WiFi时需要扫描,输入密码,而这类本身没有屏幕和键盘的硬件设备 ...

  9. call()\apply()\bind()备忘录

    这几个玩意儿几乎看一次忘一次,每次用都要重新看一遍,还是理解的不够.本文对不做深入解释,只根据自己的理解对函数定义进行语义化说明. 1.call() fun.call(context,arg1,arg ...

  10. property attribute: assign, strong, weak, unsafe_unretain and copy

    assign:用于“纯量类型”(如CGFloat 或 NSInteger等): strong:用于“对象类型”,定义了一种“拥有关系”(owning relationship),为这种属性设置新值时, ...