关键字
int 、short、long、unsigned、char、float、double、_Bool、_Complex、_lmaginary、sizeof()、
typedef
auto、extern、static、register、volatile、restricted、_Thread_local、_Atomic 、const
一、关键字部分
1.整型
1.1 有符号整型:
int:4个字节, 打印类型是%d
short:2个字节, 打印类型是%hd
long:4个字节, 打印类型是%ld
long long :8个字节,打印类型是%lld
1.2 无符号整型:无符号数用 unsigned 表示 ,只表示数据量,而没有方向(没有正负,且无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
unsigned int :4个字节, 打印类型是%u
unsigned short :2个字节, 打印类型是%hu
unsigned long :4个字节, 打印类型是%lu
unsigned long long :8个字节, 打印类型是%llu
2.字符型
字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用一对英文半角格式的单引号(’ ')把字符括起来。字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。
char 的格式化输出 为:%c
3.实型(浮点型)
单精度浮点型(float):4个字节,格式化输出为—%f,默认保留6位小数
双精度浮点型(double):8个字节,
例如:
double n = 4.566545;
printf(“n = %08.3f\n”, n);
输出的含义为:显示8位数(包含小数点), 不足8位用0填充。并且保留3位小数。对第4位做四舍五入。结果为0004.567
4.其他类型
_Bool(布尔值类型):占用1个字节,C语言没有关键字true、false。真假用非0 和0表示。
_Complex(复数类型):包括以下三种类型。
float _Complex、double _Complex、long double _Complex
float _Complex fCex = 1.0f + 1.0if; //实数 虚数 一起赋值
_lmaginary(虚数类型):有的编译器可能未定义此类型,因为复数类型已经包括虚数类型。在定义过的编译器中包括以下三种虚数类型。(了解即可)
float _Imaginary、double _Imaginary、long double _Imaginary
sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包含基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。
sizeof不能求得 void
类型的长度
sizeof能求得 void *
类型的长度
sizeof能求得静态分配内存的数组的长度
sizeof不能求得动态分配的内存的大小
sizeof不能对不完整的数组求长度
当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值
int a=10;
int arr=[1,2,3];
char str[]="hello";
int len_a = sizeof(a);
int len_arr = sizeof(arr);
int len_str = sizeof(str)
printf("len_a=%d,len_arr=%d,len_str=%d\n",len_a,len_arr,len_str)
const
static
typedef
关键字 typedef 可以为类型起一个新的别名,
typedef oldName newName;
//例如:
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
//STU 是 struct stu 的别名,可以用 STU 定义结构体变量:
STU body1,body2;
//它等价于:
struct stu body1, body2;
auto extern static register const
volatile restricted
_Thread_local _Atomic
函数:
scanf()、printf()、strlen()、fabs()、getchar()、putchar()、ctype.h、gets()、gets_s()、fgets()、puts()、fputs()、strncat()、strcmp()、strncmp()、strcpy()、strncpy()、sprintf()、strchr()
rand()、srand()、time()、malloc()、calloc()、free()
二、函数部分
scanf()
1、scanf("输入控制符", &输入参数);
2、scanf("非输入控制符 输入控制符", &输入参数);(此用法一般不用)
其中,& 为取地址符。
# include
int main(void)
{
int i, j;
printf("请输入两个值,中间以空格分隔:");
scanf("%d%d", &i, &j);
printf("i = %d, j = %d\n", i, j);
return 0;
}
printf()
调用格式:
printf("格式化字符串", 输出表列)
实列:
printf("%5d\n",1000); //默认右对齐,左边补空格
printf("%-5d\n",1000); //左对齐,右边补空格
printf("%+d %+d\n",1000,-1000); //输出正负号
printf("% d % d\n",1000,-1000); //正号用空格替代,负号输出
printf("%x %#x\n",1000,1000); //输出0x
printf("%.0f %#.0f\n",1000.0,1000.0)//当小数点后不输出值时依然输出小数点
printf("%g %#g\n",1000.0,1000.0); //保留小数点后后的0
printf("%05d\n",1000); //前面补0
格式化字符串包含三种对象,分别为:
(1)字符串常量;
(2)格式控制字符串;
(3)转义字符。
字符串常量原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。其中格式控制字符串是以 % 开头的字符串,在 % 后面跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。
strlen()
strlen函数:当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'。
#include
#include
int main()
{
char arr[10] = "abcde";
int num = strlen(arr);
printf("数组arr的长度为:%d\n", num);
return 0;
}
fabs()
fabs()函数是返回某一个值的绝对值的一个函数。
#include
#include //用到数学头文件中绝对值函数
void main()
{
int s;
float n,t,pi;
n=1.0;
pi=0;
t=1;
s=1;
while(fabs(t)>1e-6) //因为t有可能会是负数,所以需要用这个函数返回绝对值,并且精确到6个小数
{
pi=pi+t;
s=-s; //因为每一个值都是一正一负交替,这样可以保证一次正一次负
n=n+2;
t=s/n;
}
pi=pi*4; //
printf("%10.6f",pi);
}
getchar()
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回 EOF(-1)。所以 getchar()
函数返回值要用 int 整型变量来存储
getchar() - 字符输入函数,没有参数,从输入缓冲区里面读取一个字符 - 「 一次只能读取一个字符 」
EOF(-1) - end of file 文件结束标志 - 键盘上用 ctrl + z 实现
示例1:
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
示例2:
#include
int main()
{
char password[20] = { 0 };
//输入密码
printf("Input password:");
scanf("%s", password);
//---清理缓冲区---
int temp = 0;
while ((temp = getchar()) != '\n')
{
;
}
//确认密码
printf("Comfirm password(Y/N):");
int ch = 0;
ch = getchar();
//判断是否确认成功
if (ch == 'Y')
{
printf("success!\n");
}
else
{
printf("defeat!\n");
}
return 0;
}
程序的运行过程是这样的,getchar 有一个 int 型的返回值。当程序调用 getchar 时,程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符 \n 也放在缓冲区中),当用户键入回车之后,getchar() 函数才开始从输入缓冲区中每次读取一个字符,getchar 函数的返回值是用户输入的字符的 ASCII 码,若遇到文件结尾 (End-Of-File) 则返回 -1 (EOF),并将用户输入的字符回显到屏幕,如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续 getchar 调用读取。也就是说,后续的 getchar 调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才等待用户按键。程序中 while 循环工作时,每一次循环 getchar() 就会从输入缓冲区读取一个字符,然后 putchar 输出,直到遇到了文件结束标志 EOF,循环判断条件为假,循环才结束
缓冲区作用是因为计算机CPU的处理速度是很快的,我们用键盘输入速度比不上CPU的处理速度,CPU就得等键盘输入完,很浪费资源,所以,当键盘输入完了,让CPU一次性处理,可以大大提高效率。
putchar()
#include
/*[案例] putchar() 函数的格式和使用方法。
/*功能:说明putchar()函数的格式和使用方法。*/
/*编译预处理命令:文件包含*/
main()
{
char ch1='N', ch2='E', ch3='W';
putchar(ch1);
putchar(ch2);
putchar(ch3); /*输出*///有换行才换行
putchar('\n'); //有换行才换行
putchar(ch1); putchar('\n'); /*输出ch1的值,并换行*/
putchar('E'); putchar('\n'); /*输出字符'E',并换行*/
putchar(ch3);putchar('\n'); //有换行才换行
}
ctype.h
ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节(Byte)字符,也支持宽字符。
头文件包括两类函数:
1. 字符测试函数
2. 字符映射函数
3. ctype.h头文件包含的常用函数如下:
isalpha
iscntrl
isdigit
isgraph
islower
isupper
tolower
toupper
isalnum
isprint
ispunct
gets()
gets() 函数它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加一个空字符使其成为一个字符串。 gets()函数不检查函数边界,有多少字符它就给你输入多少(来者不拒),这就造成了一个问题:缓冲区溢出(buffer overflow)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其覆盖)这样就很容易出现问题(一般不建议使用)
gets_s() fgets()
gets_s(char *p,int n);//n表示其最多读取的数量,一般为数组大小
puts() fputs()
strcat() strncat()
strcmp() strncmp()
strcpy() strncpy()
sprintf() strchr()
rand() srand() time() malloc() calloc() free()