“第八天” printf ,scanf

EOF     :EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
        最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
————————————————
版权声明:本文为CSDN博主「一个奔跑的C」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/henu1710252658/article/details/83040281

1、这里简单讲述一下printf函数和scanf函数转换说中的修饰符:

         printf函数中修饰符:

        //数字 表示最小字段宽度,如果该字段不能容纳待打印的数字或者字符串,系统会用更大的字段,如果数字位数小于字段宽度,会在前面补空格,以达到最小字段宽度,如%4d。
        // 数字 用来确定精度,对于浮点型,用来表示小数点右边数字的位数,对于字符串转换,用来表示待打印字符的最大数量,  对于整型转换,表示待打印字符的最大数量,如有必要,会在前面补0来达到这个最小位数。

     printf中的标记:

        // - 待打印项左对齐,即从字段的左侧开始打印该项(如果数字位数小于字段宽度,会从后面补空格,以达到最小字段宽度),如%-4d.

        // + 显示正负号,如果符号值为正,则在值前面显示加号,如果为负,则在值前面显示减号。如 %+6.2f 。

        // 空格 有符号值若为正,则在值前面显示前导空格(不显示任何符号),若为负,则在值前面显示减号标记,并覆盖空格,如 %6.2f。

        // # 将结果转换为另一种形式,在此暂不讲。

        // 0 对于数值格式,用前导0代替空格填充字段宽度,对于整数格式,如果出现 - 标记或指定精度,则忽略该标记,如%010d。

        对于整型而言,如图,第一种是正常打印;第二种虽然定义了最小字段宽度,但由于小于数字位数,所以系统自动使用更大的宽度,所以结果和第一种一样;第三种则是最小字段宽度大于数字位数,所以在数字左边自动补0,以达到最小字段宽度;第四种则是定义了精度,但对于整型而言,用来表示打印的最大数量,如果最大数量大于位数,则在左方补0;第五种是定义精度小于位数的情况,但从运行结果也可以看出,系统还是会自动扩大;第六种则是修饰符和标记的联合使用,0是标记,5是修饰符数字,由于最小字段宽度大于位数,所以用0代替空格从左边开始填充,第七种则是标记 - ,让数字从左侧打印,右边填充,这里可以和第八种对比一下,理解上面说的如果 0 和 - 标记或者指定精度共同出现,则忽略 0 标记,所以第八种的结果并不会在右边补0。

“第八天” printf ,scanf_第1张图片

        对于浮点型

对于浮点型而言,系统默认是6位有效数字,所以第一种是正常打印;第二种和上面的整型一样,定义了最小字段宽度,但小于位数,系统自动扩大宽度;第三种由于定义了精度为小数点后保留一位,所以此时浮点型的位数小于了定义的最小字段宽度,所以前面自动填充空格,注意这里的前面只填充了一个空格,也就是说小数点也是算一个宽度的;剩下的就可自行分析。

“第八天” printf ,scanf_第2张图片

        对于字符串大致也是如此,但在这里点一下是,在printf打印的时候是会识别字符串中的空格的,视为一个字符,这里和后面的scanf不太一样。

        scanf转移说明中的修饰符

        // * 抑制赋值

        // 数字 最大字符宽度(注意printf中的作用是最小字符宽度),输入在达到最大字符宽度处,或者第一次遇到空白字符时停止;

        scanf 读取输入:

1、假设scanf根据一个%d来读取一个整数,之前已经说过了scanf是如何读取键入的数据的,scanf在读取一个字符时,会跳过前面所有的空白字符,直到第一个非空白字符开始读取,在这里因为scanf需要提取一个整型,所以遇到的第一个非空白字符应该是一个数字字符或一个符号(+/-),如果是的话,它便从缓冲区读取和保存这个字符,然后继续读取缓冲区,如果下一个字符还是数字,它便保存该数字继续读取下一个字符,如此不断的读取和保存,直至遇到非数字字符,此时它便认为读到了整数的末尾,然后scanf函数计算已读取数字(可能有符号)的数值,然后将计算后的值放入指定的变量中去。此时缓冲区的第一个字符是刚刚scanf所遇到的非数字字符,这意味着,如果程序在下一次读取输入时, 首先读到的便是这个非数字字符(非空白字符),而如果scanf需要的是一个整型时,当一个遇到的是一个非数字字符,由于scanf无法读取,又无法清理缓冲区,便会因为无法越过这个字符,而卡在这里。如下图:

“第八天” printf ,scanf_第3张图片

“第八天” printf ,scanf_第4张图片

2、scanf读取%s转换说明的字符串,scanf函数会读取除空白(开始处,在读取过程中遇到,空白字符,会停止读取)以外的所有字符,这里scanf函数跳过最初的空白开始读取第一个非空白字符,保存之后,继续读取,直至再次遇到空白字符,这意味着如果使用scanf函数(只有一个%s)只能读取一个单词,即不包含空白字符的字符串,而如果使用字符宽度的话,scanf也只是在字段末尾或者第一次遇到空白字符处停止,无法实现读取多个单词。同时不要忘记,当scanf把字符串放进去指定数组中的是时候,它会在字符序列的末尾加上 ' \0' ,让数组成为一个字符串,增加的这个 ’\0‘ 请千万记住。 

“第八天” printf ,scanf_第5张图片

使用多个数组是可以实现读取带有空白字符的字符串的,但这里却只能记录非空格字符,因为无论字符串中间有多少个连续的空白字符,在scanf根据第二个%s读取字符串时,会直接跳过字符串中间的全部空白字符,去读取非空白字符。

“第八天” printf ,scanf_第6张图片

        这里点一个小点:scanf函数和printf函数都是有返回值的。

scanf的返回值是成功读取的项数,如果没有读取任何项,且需要一个数字,用户却输入一系列非数字字符,则返回 0 。 如果scanf 检测到文件末尾时,会返回EOF。

“第八天” printf ,scanf_第7张图片“第八天” printf ,scanf_第8张图片

同时scanf是允许把普通字符放在格式字符串中的,除空格字符以外的普通字符必须和输入字符串严格一致。因为scanf在读取两个转义字符时,在读取第一个输入项之后,会跳过下一个输入项前面的所有空白,这里的空白应该主要指的就是空格.

这个理解感觉怪怪的,下面这个,我允许尝试了很多次,对于这种有非空格以外的普通字符(这里是逗号),如果普通符号的一侧有空格,那么在输入时,在这里的同一则可以输入任意数量的空格,如果没有的话,但输入了,就会影响后面的数值读取和输入。而如果两个转义字符中间只有空格或者没有普通字符,则输入任意数量的空格也不会影响读取,这里语言表达可能不太好,有兴趣的可以自己试一下,但由于我目前使用的只有vs2022,所以我无法确定是C语言本身的特点,还是编程软件的特点。

“第八天” printf ,scanf_第9张图片

“第八天” printf ,scanf_第10张图片

“第八天” printf ,scanf_第11张图片

printf的返回值:返回的输出的字符数,包括字母,数字,符号,好像还有转义字符,因为下面n的值是8,包括转义字符 ’\n‘ 这个值才是对的,由于不太熟悉,不多叙述,后面如果了解更多再补。“第八天” printf ,scanf_第12张图片

你可能感兴趣的:(c语言)