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 ",a);    //a=1234

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

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

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

    printf("a=%-6d ",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 m1=%f m2=%f n=%lf n1=%f ",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 ",m);   

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

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

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

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

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

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

    printf("c=%6.9s ",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()里面加个" "

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

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

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

以上。

原文地址:https://www.cnblogs.com/sylvialucy/p/4852831.html