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

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.

C语言 1

2.

C语言 2

就简单截代码的一无是处就在有限只对接的scanf(“%c”,&ch);当第一独读入一个假名后,第二个ch读入了回车;为了避免这种情况,我们出点儿种办法缓解。

一律是加个getchar();吃少回车

其次凡scanf()里面加个”\n”

据此地方两只代码的改方法是:

首先单代码在循环之中的scanf(“%c”,&ch1);这句前面加个getchar();  
或者转移成为scanf(“\n%c”,&ch1);

老二个代码错在\n的职位,while外面还有一个scanf,之后便发出一个回车需要用,所以一直把\n放在前,scanf(“\n%c”,&ch1);这样即便可以了。

以上。