C语言学习笔记

关键字

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 <stdio.h>
int main(void)
{
    int i, j;
    printf("请输入两个值,中间以空格分隔:");
    scanf("%d%d", &i, &j);
    printf("i = %d, j = %d\n", i, j);
    return 0;
}
  1. 在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。
  2. scanf 中双引号内,除了“输入控制符”外什么都不要写。
  3. “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
  4. “输入控制符”的类型和变量所定义的类型一定要一致。
  5. 使用 scanf 之前先用 printf 提示输入。

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 <stdio.h>
#include <string.h>
int main()
{
	char arr[10] = "abcde";
	int num = strlen(arr);
	printf("数组arr的长度为:%d\n", num);
 
	return 0;
}

fabs()

fabs()函数是返回某一个值的绝对值的一个函数。

#include<stdio.h>
#include<math.h>   //用到数学头文件中绝对值函数
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<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}


示例2:
#include<stdio.h>
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()

  1. putchar()函数的格式: putchar(ch); 其中ch可以是一个字符变量或常量,也可以是一个转义字符。
  2. putchar()函数的作用:向终端输出一个字符。
    (1)putchar()函数只能用于单个字符的输出,且一次只能输出一个字符。另外,从功能角度来看,printf()函数可以完全代替putchar()函数。
    (2)在程序中使用putchar()函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即:#include “stdio.h”——表示要使用的函数,包含在标准输入输出(stdio)头文件(.h)中。
#include	<stdio.h> 
/*[案例] 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. 字符测试函数

  1. 函数原型均为int isxxxx(int)
  2. 参数为int, 任何实参均被提升成整型
  3. 只能正确处理处于[0, 127]之间的值

2. 字符映射函数

  1. 函数原型为int toxxxx(int)
  2. 对参数进行检测, 若符合范围则转换, 否则不变
    int tolower(int); 'A'~'Z' ==> 'a'~'z'
    int toupper(int); 'a'~'z' ==> 'A'~'Z'

3. ctype.h头文件包含的常用函数如下:

isalpha

  • 函数名称: isalpha
  • 函数原型: int isalpha(char ch);
  • 函数功能: 检查ch是否是字母.
  • 函数返回: 是字母返回非0(在vs2015中为2) ,否则返回 0.

iscntrl

  • 函数名称: iscntrl
  • 函数原型: int iscntrl(int ch);
  • 函数功能: 检查ch是否控制字符(其ASCII码在0和0x1F之间,数值为 0-31).
  • 函数返回: 是返回非0,否则返回 0.

isdigit

  • 函数名称: isdigit
  • 函数原型: int isdigit(char ch);
  • 函数功能: 检查ch是否是数字(0-9)
  • 函数返回: 是返回非0,否则返回0

isgraph

  • 函数名称: isgraph
  • 函数原型: int isgraph(int ch);
  • 函数功能: 检查ch是否可显示字符(其ASCII码在0x21到0x7E之间),不包括空格
  • 函数返回: 是返回非0,否则返回0

islower

  • 函数名称: islower
  • 函数原型: int islower(int ch);
  • 函数功能: 检查ch是否小写字母(a-z)
  • 函数返回: 是返回非0,否则返回0

isupper

  • 函数名称: isupper
  • 函数原型: int isupper(int ch);
  • 函数功能: 检查ch是否是大写字母(A-Z)
  • 函数返回: 是返回非0,否则返回0

tolower

  • 函数名称: tolower
  • 函数原型: int tolower(int ch);
  • 函数功能: 将ch字符转换为小写字母
  • 函数返回: 返回ch所代表的字符的小写字母

toupper

  • 函数名称: toupper
  • 函数原型: int toupper(int ch);
  • 函数功能: 将ch字符转换成大写字母
  • 函数返回: 与ch相应的大写字母

isalnum

  • 函数名称: isalnum
  • 函数原型: int isalnum(int ch);
  • 函数功能: 检查ch是否是字母或数字
  • 函数返回: 是字母或数字返回非0,否则返回0

isprint

  • 函数名称: isprint
  • 函数原型: int isprint(int ch);
  • 函数功能: 检查ch是否是可打印字符(包括空格),其ASCII码在0x20到0x7E之间
  • 函数返回: 是返回非0,否则返回0

ispunct

  • 函数名称: ispunct
  • 函数原型: int ispunct(int ch);
  • 函数功能: 检查ch是否是标点字符(不包括空格),即除字母,数字和空格以外的所有可打印字符
  • 函数返回: 是返回非0,否则返回0

gets()

gets() 函数它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加一个空字符使其成为一个字符串。 gets()函数不检查函数边界,有多少字符它就给你输入多少(来者不拒),这就造成了一个问题:缓冲区溢出(buffer overflow)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其覆盖)这样就很容易出现问题(一般不建议使用)

gets_s()     fgets()

gets_s(char *p,int n);//n表示其最多读取的数量,一般为数组大小
  • gets_s()只从标准输入中读取数据,所以起形式为
  • ​​​​​​​gets_s()读到换行符,会丢弃它。
  • 如果输入行太长,gets_s()会丢弃该输入行的其余字符。
  • 解释:其优越性在于第三点:正常来讲,输入行中多出来的字符会被留在缓冲区中,成为下一次读取语句的输入。如果下一次读取的是int 或者double类型,就可能导致程序崩溃。但优点同时也是缺点,因为在其抛弃字符的同时并不会告知我们,一旦输入出现问题我们必须自己查找。

puts()   fputs()  

strcat()   strncat()

strcmp()   strncmp()

strcpy()   strncpy()

sprintf() ​​​​​​​  strchr() ​​​​​​​   

rand()     srand()     time()    malloc()   calloc()    free()


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值