C语言中的格式控制

C语言确实很强大,很自由,特别是输入输出时的格式控制,熟练这些格式控制问题,可以很方便的解决很多奇怪的问题。当然,scanf和printf两个函数也因它们的自由度和安全性而备受批评,特别是在大型程序设计中,一般是尽可能避免用这两个函数的。但是对于习惯用C和参加ACM/ICPC的人来说,这两个函数的重要性无可替代。

(sscanf和sprintf这两个函数和scanf,printf类似,但是sscanf和sprintf更危险,略去不提)

scanf和printf函数格式:

                       scanf(格式控制串,变量地址表)

                       printf(格式控制串,变量表)

scanf的格式控制一般格式:

              %  [*]  [域宽]  类型字符

printf的格式控制一般格式:

             %  [-]  [0]  [域宽]  类型字符

先说两者的共同点。

类型字符

%d,十进制整型int;%ld,十进制整型long;%lld,十进制整型long long;%I64d,十进制整型_int64

%o,八进制整型

%x,十六进制整型

%u,无符号十进制整型

%f,实型float;%lf,实型double,小数位数默认都是6位

%c,一个字符

%s,字符串

当然,还有hd等的这些short中使用的类型字符就略去了,毕竟还有谁会用short类型呢?

各自特点:

先说scanf

                  scanf(格式控制串,变量地址表)

注意这里是变量地址表,不是变量表,即输入时一般要加字符&,不加的话就直接对地址操作,这是非常危险的。

格式控制:                  %  [*]  [域宽]  类型字符

1.符号*表示跳过该输入值。这个在某些情况下非常好用,比如说输入时要跳过一个空格,则可以这样写:%*c,跳过一个字符。

2.域宽只能是整数,表示截取的相应宽度的输入值赋给后边相应的变量。

        如:scanf("%3d",&x)

        若输入12345,则x的值为123;若输入12,则x就是12

3.这里要介绍一个非常少见的格式控制方法[…]或[^...],官方名字叫扫描集(scanset)。

        例1:scanf("%[0123456789]",strings)        //strings是一个字符串数组

        则输入值必须在0-9中,如果输入123a456,则strings保存的只是123,到a处截止。当然,扫描集中的元素可以用连接字符“-”来表示,如0123456789可以写成0-9,也可以写成9-0。

        例2:scanf("%[^012]",strings)

        则输入的值要除去012,比如输入abc321s,则strings保存的是abc3,到2处截止。

        别小看这个扫描集!有时候要输入一行字符串时,一般要用gets()函数,但是当这个函数和scanf连用时,会发生很多很奇怪的错误,而用扫描集就非常方便。

        例3:scanf("%[^\n]",strings)

        这样就可以直接读入一行字符串且光标换到了下一行。当然,扫描集中例也可以定义空格,其他符号等等。

    注意:扫描集是一个集合,而集合是无顺序的,也就是说[012]也可以写成[021]  [120]  [0-2]  [2-0]

            扫描集是区分大小的,也就是说[A-Z]和[a-z]是完全不同的。

 

printf

             %  [-]  [0]  [域宽]  类型字符

1.符号“-”表示输出左对齐,这里主要针对域宽起作用,如果没有定义域宽,则这个符号基本上没用。

2.符号0,表示空位用0填充。

3.域宽。

默认为右对齐,空位默认为空格。

域宽可以这样写:[m]  [m.n]  [.n],[m]表示输出宽度为m。若输出值宽度大于m,则如实输出;[m.n]主要用于实型的输出,表示输出占m个位置,其中有n个小数位,若输出值的数位大于m,则如实输出,而小数位则四舍五入到n位,不足的补0;[.n]就是[0.n]。

      例:float x=12.39;

           printf("%2.3f",x); // 输出12.390,没有多余空格

           printf("%7.3f",x);  //输出_12.390,第一位是空格,注意这里小数点也算一位

           printf("%.1f",x);  //输出12.3,没有多余空格

域宽还有一种比较奇怪的定义方法:

           printf("%*.*f",m,n,x);  //表示域宽是m.n,输出值是x

这样就可以在程序运行过程中控制输出域宽。

4.字符串输出

字符串的输出主要是域宽的控制问题。

写法和上面的一样,但是定义略有不同。[m.n]表示输出占m个位置,截取字符串的前n个字符输出,默认右对齐,空位默认为空格。

5.实型的输出

实型输出有三种类型字符,一个是f和lf,一个是e和E,一个是g和G。

l和lf上面已经说过,e表示输出的实型按照科学计数法输出,g表示自动选取f格式和e格式中较短的一个输出,不输出无意义的0。

        例:float x=12.34;

             printf("%f",x);     //输出12.340000

             printf("%e",x);    //输出1.234000e+001

             printf("%E",x);   //输出1.234000E+001,就是把小写e变成大写E,下面的g和G类似情况

             printf("%g",x);    //输出12.34

对于float,使用%f格式符输出时,仅前7位是有效数字,小数6位.
对于double,使用%lf格式符输出时,前16位是有效数字,小数6位.

 

C语言的常用的格式控制就这些。一般来说,推荐使用C++中的cin和cout,安全,直接。但是C的效率是C++望尘莫及的,敲程序时注意两者的结合使用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言的输出格式控制符用于指定输出的格式。以下是一些常用的输出格式控制符: - %c:输出一个单一的字符。 - %d、%ld:以十进制、有符号的形式输出short、int、long类型的整数。 - %u、%lu:以十进制、无符号的形式输出short、int、long类型的整数。 - %o、%lo:以八进制、不带前缀、无符号的形式输出short、int、long类型的整数。 - %#o、%#lo:以八进制、带前缀、无符号的形式输出short、int、long类型的整数。 - %x、%lx:以十六进制、不带前缀、无符号的形式输出short、int、long类型的整数。如果x小写,输出的十六进制数字也小写;如果X大写,输出的十六进制数字也大写。 - %#x、%#lx:以十六进制、带前缀、无符号的形式输出short、int、long类型的整数。如果x小写,输出的十六进制数字和前缀都小写;如果X大写,输出的十六进制数字和前缀都大写。 - %f、%lf:以十进制的形式输出float、double类型的小数。 - %e、%le:以指数的形式输出float、double类型的小数。如果e小写,输出结果的e也小写;如果E大写,输出结果的E也大写。 - %g、%lg:以十进制和指数较短的形式输出float、double类型的小数,并且小数部分的最后不会添加多余的0。如果g小写,当以指数形式输出时e也小写;如果G大写,当以指数形式输出时E也大写。 - %s:输出一个字符串。 以下是一个使用示例: ```c #include <stdio.h> int main() { int a = 12; float b = 3.1415; char c = 'A'; printf("%d\n", a); printf("o%o\n", a); printf("0x%x\n", a); printf("%3.2f\n", b); printf("%c\n", c); return 0; } ``` 输出结果为: ``` 12 o14 0xc 3.14 A ``` 希望这个回答对你有帮助!\[1\] \[2\] #### 引用[.reference_title] - *1* [C语言 printf](https://blog.csdn.net/imxlw00/article/details/89287406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[C语言]格式控制符](https://blog.csdn.net/m0_74290207/article/details/129461436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值