本专栏目的
- 更新C/C++的基础语法,包括C++的一些新特性
C语言输入输出优势
- 速度快(比C++的std::cin和std::cout函数)
- 可以控制输入和输出数据类型
- 方便数据通过不同格式输出
- 在并行编程中可以保证输出顺序
- 其他
头文件:#include<stdio.h>
文章目录
输出
printf
printf是最常用的输出函数,可以格式化输出任意的基本数据类型的变量。
int printf(const char*format,...)
参数
-
format:一个C字符串,包含要写入标准输出的文本,它可以选择性的包含嵌入的格式说明符,也叫(占位符)
-
输出的格式说明符规则:%[flags][width][.precision]specifier
flags
flag 描述 - 在给定字段宽度内左对齐,默认是右对齐的 + 强制在结果前面加上加号或减号 ( +
或-
),即使对于正数也是如此。默认情况下,只有负数前面带有一个负号。(空格) 如果不打算写入任何符号,则会在值之前插入一个空格。 # 与o、x、X一起使用,输出时显示数值的基数(0x、o) 0 指定填充时,用零 ( 0
) 而不是空格填充左边的空间width
width 描述 (数字) 要打印的最小字符数。如果要打印的值小于此数字,则用空格填充结果。 * width不在字符串中指定,而是在必须格式化的参数之前的附加整数值参数指定。 precision(输出精度的控制)
precision 描述 .number 对于整数说明符 (d,i,o,u,x,X):precision指定要写入的最小位数。如果要写入的值短于此数字,则结果将用前导零填充。即使结果较长,也不会截断该值。精度为 0 表示不为值0写入任何字符。
对于e、E、f和F说明符:这是小数点后要打印的位数(默认情况下为 6)。
对于g和G说明符:这是要打印的最大有效位数(整数+小数部分)。
对于s:这是要打印的最大字符数。默认情况下,将打印所有字符,直到遇到结尾空字符。.* precision不是在格式字符串中指定的,而是作为必须格式化的参数之前的附加整数值参数指定的。
-
-
…:"输出列表"中的数据可以是合法的常量、变量和表达式,要与“格式控制字符串”中的格式一一对应。
返回值
如果成功,则返回写入的字符总数。
如果发生写错误,则设置错误指示符(ferror)并返回负数。
注意
- 输入返回值的在很多时候用处很大,比如说在刷算法题中判断变量是否读完等。
putchar
- 作用仅仅为了打印一个字符在显示器屏幕上,C提供了一个库函数putchar来完成这个简单的任务。
int putchar(int ch);
putchar('A');
puchar(65);
puts
- 仅仅是为了输出一个字符串,使用printf函数也稍显麻烦,可以使用C提供的一个库函数puts,而且puts函数会在输出字符串之后,并且可以自动进行换行(默然带有换行符)。
int puts(const char*str);
puts("hello world");
输入
scanf
从[stdin]读取数据,并根据参数format将它们存储到附加参数所指向的位置。
int scanf(const char* format,...);
参数
-
format:C 字符串,包含一系列字符,这些字符控制如何处理从流中提取的字符
- **空格字符:**该函数将读取并忽略在下一个非空格字符之前遇到的任何空格字符(空格、换行、制表)
- **非空字符、格式说明符之外的字符:**如果输入流中的字符和format中的字符不匹配,函数将失败。
- **格式说明符:**用于指定要从流中检索并存储到附加参数所指向的位置的数据的类型和格式。
scanf
的格式说明符遵循以下原型:
%[*][width]specifier
子说明符 | 描述 |
---|---|
* | 表示忽略输入的数据 |
width | 指定当前读取操作中要读取的最大字符数 |
- …:"输入列表"中的数据必须是合法变量的地址表(即变量前面加&符),要与“格式控制字符串”中的格式一一对应。
- 如果输入的输入不止一个,在format格式控制字符串中,必须以空格间隔。
示例:
const double PI = 3.1415;
int radius = 0;
printf("请输入半径:\n");
scanf("%d", &radius);
printf("圆的面积为:%lf", PI * radius * radius);
scanf函数注意事项
scanf函数的格式字符串由以下三类字符组成:
-
1、格式符(也叫占位符)
和printf函数类似,scanf函数的格式字符串以%开始,以一个格式字符结束,中间可以插入附加的字符。格式符告诉了scanf函数该读取什么样的数据。 -
2、空白符
空白符可以是空格(用空格键输入)、制表符(用Tab键输入)和新行符(用回车键输入)。 -
3、非空白符
除去格式说明符合空白符之外,就是非空白符。非空白符在用户输入的时候,也必须一并输入。
getchar
可以非常方便的输入一个字符。
int getchar();
gets_s
可以非常方便的输入一个字符串。
char* gets_s(char* _Buffer,size_t _Size);
占位符(格式说明符)
占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号,广泛用于计算机中各类文档的编辑。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。
C语言中,有专门的格式占位符对整型、浮点型、指针类型进行输入输出。
整型
- 基本的输出
占位符 | 说明 |
---|---|
%c | 输出字符 |
%hd | 输出short类型 |
%d、%i | 输出int类型 |
%hu | 输出 unsigned short |
%u | 输出 unsigned int |
- 加长版
占位符 | 说明 |
---|---|
%ld | long int |
%lu | unsigned long int |
%lld | long long int |
%llu | unsigned long long int |
- 指定进制输出
占位符 | 说明 |
---|---|
%o | 有符号八进制整数 |
%x,%X | 无符号十六进制整数,并以小写abcdef表示|并以大写ABCDEF表示 |
如果想要输出相应的进制的前缀,可以在%和符号之间加上#。
int a = 10;
printf("%#o\n", a);
printf("%#x %#X\n", a, a);
OUTPUT:
012
0xa 0XA
浮点型
占位符 | 说明 |
---|---|
%f、%F | float |
%lf、%LF | double |
%e,%E | 以指数形式输出浮点数(输入时小数形式和指数形式都可以识别) |
%g,%G | 自适应输出小数或者指数形式(输入时小数形式和指数形式都可以识别) |
- %g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0。
printf("%g\n", 0.00001234); //1.234e-05
printf("%g\n", 0.0001234); //0.0001234
指针类型
占位符 | 说明 |
---|---|
%p | 以十六进制的方式输出地址 |
字符串
占位符 | 说明 |
---|---|
%s | 输出/输入以\0结尾的字符串 |
%[] | 输入字符串的特殊占位符 |
%[ ],这个参数的意义是读入一个字符集合。[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是"^“,这说明读取不在”^“后面集合的字符,既遇到”^“后面集合的字符便停止。如果要在循环中用scanf(”%[^\n] "**, s)**读取多行的字符串,就要在读取一行后,再用scanf(“%c”,ch) 或者getchar()函数读取一个字符(换行符),将输入缓冲区中的换行符给读出来。否则的话,在下一次读取一行的时候,第一个就遇到’\n’,就会读入一个空字符串。
百分号
占位符 | 说明 |
---|---|
%% | 输出一个百分号 |
注意事项:
很多同学在输出的时候,会遇到很多啊问题,大概就是以下几点:
- 格式字符中,除了X、E、G、F外,其他均用小写字母,如“%d”不能写成“%D”。
- 不同类型的数据应使用相应类型的格式字符说明其输出形式。
- 如需输出双引号,应在“格式控制”中表示为转义字符的形式并用单引号引起来,即“\””。
- 如需输出字符“%”,在“格式控制”中用连续两个“%”即可。
如:printf(“%d%%”,s); - 当“格式控制”中格式符个数少于输出表中的输出项时,多余的输出项不予输出。
- 当“格式符”多于输出项时,结果为不定值。
- 非常需要注意的:有些字符是输出不出来的,如’/5’这些,注意这样原因是在进行网络通信的时候为了防止粘包问题的出现,通过将数据封装成TLV结构,TLV结构头就是内容长度,长度一字符形式接收和传递,故注意有时候会输出不出来长度,需要转换成整数类型才行。
typedef
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等
在使用复杂指针类型时,比如函数指针,可以用typedef取别名,不需要每次都写很长的指针定义。
定义:typedef 类型 别名;
- typedef int INT;INT就是我们定义的新类型,此时可以用INT 代替int来定义整型变量
- typedef void (*PFUNA)(int a); ———— 在语句开头加上typedef关键字,PFUNA就是我们定义的新类型
一,typedef的一个重要用途是定义机器无关的类型。
例如,定义一个叫REAL的浮点类型,该浮点类型在目标机器上可以获得最高的精度:
typedef long double Real;
如果在不支持 long double 的机器上运行相关代码,只需要对对应的typedef语句进行修改,例如:
typedef double Real;
或者:
typedef float Real
二,使用typedef为现有类型创建别名,给变量定义一个易于记忆且意义明确的新名字。
- 类型过长,用typedef可以简化一下
typedef unsigned int UInt32
stdint.h
简介
stdint.h 头文件定义了各种整型的别名。定义在该头文件中的宏限制了各种整型(比如 char、int 和 long)的值。
这些限制指定了变量不能存储任何超出这些限制的值,例如一个无符号可以存储的最大值是 255。
库宏(定义了数据最大和最小数据范围)
下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。
宏 | 值 | 描述 |
---|---|---|
INT8_MIN | -128 | 定义一个字节的比特数。 |
INT16_MIN | -32768 | 定义一个有符号字符的最小值。 |
INT32_MIN | -2147483648 | 定义一个有符号字符的最大值。 |
INT64_MIN | -9223372036854775808 | 定义一个无符号字符的最大值。 |
INT8_MAX | 127 | 定义类型 char 的最小值,如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。 |
INT16_MAX | 32767 | 定义类型 char 的最大值,如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。 |
INT32_MAX | 2147483647 | 定义多字节字符中的最大字节数。 |
INT64_MAX | 9223372036854775807 | 定义一个短整型的最小值。 |
UINT8_MAX | 255 | 定义一个短整型的最大值。 |
UINT16_MAX | 65535 | 定义一个无符号短整型的最大值。 |
UINT32_MAX | 4294967295 | 定义一个整型的最小值。 |
UINT64_MAX | 18446744073709551615 | 定义一个整型的最大值。 |
别名
typedef signed char int8_t;
typedef short int16_t;
typedef int int32_t;
typedef long long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
math.h(了解即可)
简介
math.h 头文件定义了各种数学函数和一个宏。在这个库中所有可用的功能都带有一个 double 类型的参数,且都返回 double 类型的结果。
库函数
序号 | 函数&描述 |
---|---|
1 | double acos(double x) 返回以弧度表示的 x 的反余弦。 |
2 | double asin(double x) 返回以弧度表示的 x 的反正弦。 |
3 | double atan(double x) 返回以弧度表示的 x 的反正切(角度转弧度:x * PI / 180) |
4 | double atan2(double y, double x) 返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。 |
5 | double cos(double x) 返回弧度角 x 的余弦 |
6 | double cosh(double x) 返回 x 的双曲余弦。 |
7 | double sin(double x) 返回弧度角 x 的正弦。 |
8 | double sinh(double x) 返回 x 的双曲正弦。 |
9 | double tanh(double x) 返回 x 的双曲正切。 |
10 | double exp(double x) 返回 e 的 x 次幂的值。 |
11 | double frexp(double x, int *exponent) 把浮点数 x 分解成尾数和指数。返回值是尾数,并将指数存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。 |
12 | double ldexp(double x, int exponent) 返回 x 乘以 2 的 exponent 次幂。 |
13 | double log(double x) 返回 x 的自然对数(基数为 e 的对数)。 |
14 | double log10(double x) 返回 x 的常用对数(基数为 10 的对数)。 |
15 | double modf(double x, double *integer) 返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。 |
16 | double pow(double x, double y) 返回 x 的 y 次幂。 |
17 | double sqrt(double x) 返回 x 的平方根。 |
18 | double ceil(double x) 返回大于或等于 x 的最小的整数值。 |
19 | double fabs(double x) 返回 x 的绝对值。 |
20 | double floor(double x) 返回小于或等于 x 的最大的整数值。 |
21 | double fmod(double x, double y) 返回 x 除以 y 的余数。 |
ctype.h(了解即可)
简介
C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符。
这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符号字符。
如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。
库函数
下面列出了头文件 ctype.h 中定义的函数:
序号 | 函数&描述 |
---|---|
1 | int isalnum(int c) 该函数检查所传的字符是否是字母和数字。 |
2 | int isalpha(int c) 该函数检查所传的字符是否是字母。 |
3 | int iscntrl(int c) 该函数检查所传的字符是否是控制字符。 |
4 | int isdigit(int c) 该函数检查所传的字符是否是十进制数字。 |
5 | int isgraph(int c) 该函数检查所传的字符是否有图形表示法。 |
6 | int islower(int c) 该函数检查所传的字符是否是小写字母。 |
7 | int isprint(int c) 该函数检查所传的字符是否是可打印的。 |
8 | int ispunct(int c) 该函数检查所传的字符是否是标点符号字符。 |
9 | int isspace(int c) 该函数检查所传的字符是否是空白字符。 |
10 | int isupper(int c) 该函数检查所传的字符是否是大写字母。 |
11 | int isxdigit(int c) 该函数检查所传的字符是否是十六进制数字。 |
字符转换函数(算法常用)
序号 | 函数&描述 |
---|---|
1 | int tolower(int c) 该函数把大写字母转换为小写字母。 |
2 | int toupper(int c) 该函数把小写字母转换为大写字母。 |
字符类型
序号 | 字符类型 | 描述 |
---|---|---|
1 | 数字 | 完整的数字集合 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } |
2 | 十六进制数字 | 集合 { 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f } |
3 | 小写字母 | 集合 { a b c d e f g h i j k l m n o p q r s t u v w x y z } |
4 | 大写字母 | 集合 {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z } |
5 | 字母 | 小写字母和大写字母的集合 |
6 | 字母数字 | 数字、小写字母和大写字母的集合 |
7 | 标点符号 | 集合 ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { |
8 | 图形字符 | 字母数字字符和标点符号字符的集合 |
9 | 空格字符 | 制表符、换行符、垂直制表符、换页符、回车符、空格符的集合。 |
10 | 可打印字符 | 字母数字字符、标点符号字符和空格字符的集合。 |
11 | 控制字符 | 在 ASCII 编码中,这些字符的八进制代码是从 000 到 037,以及 177(DEL)。 |
12 | 空白字符 | 包括空格符和制表符。 |
13 | 字母字符 | 小写字母和大写字母的集合。 |