零基础C语言
基础知识:
1、auto:声明自动变量,一般不使用。
2、break:跳出当前循环。
3、case:开关语句分支。
4、char:声明字符型变量或函数。
5、const:声明只读变量。
6、continue:结束当前循环,开始下一轮循环。
7、default:开关语句中的“其他”分支。
8、do:循环语句的循环体。
9、double:声明双精度变量或函数。
10、else:条件语句否定分支。(可与if连用)
11、enum:声明枚举类型。
12、extern:声明变量是在其他文件正声明。
13、float:声明浮点型变量或函数。
14、for:循环当中的一种语句。
15、goto:无条件跳语句。
16、int:声明整型变量或函数。
17、if:条件语句。
18、long:声明长整型变量或函数。
19、register:声明寄存器变量。
20、return:子程序返回语句(可以带参数,也可以不带参数)函数遇到return就不再进行下面的语句了。
21、short:声明短整型变量或函数。
22、signed:生命有符号类型变量或函数。
23、sizeof:计算数据类型长度。
24、static:声明表态变量。
25、struct:声明结构体变量或函数。
26、switch:用于开关语句。
27、typedef:用以给数据类型取别名(当然还有其他作用)。
28、union:声明联合数据类型。
29、unsigned:声明无符号类型变量或函数。
30、void:声明函数无返回值或无参数,声明无类型指针。
31、volatile:说明变量在程序执行中可被隐含地改变。
32、while:循环语句的循环条件。
判断该年年份是闰年的条件:
-
能被4整除,但不能被100整除
-
能被400整除
1.计算机系统的组成
计算机硬件由运算器、控制器、存储器、输入设备及输出设备五大基本部件组成

2.C语言程序
1.源文件以.c为后缀
2.目标程序以.obj为后缀
3.可执行文件以.exe为后缀
4.程序总是从main函数开始执行的
5.程序中要求计算机完成操作是由函数中的C语句完成的
6.在每个数据声明和语句的最后必须有一个分号
7.C语言本身不提供输入输出语句
8.程序应当包含注释
9.一个函数的两个部分:
(1)函数首部
例如:
int main()
int max(int x,int y)
(2)函数体
{
函数体
}
函数体包括:声明部分和执行部分
声明部分,例如:int max(int x,int y);
3.算法
算法+数据结构=程序
算法的特性:有穷性,确定性,有零个或多个输入,有一个或多个输出,有效性
4.什么是字节
字节(Byte,B)就是存储数据的单位,并且是硬件所能访问的最小单位
1字节=8位
1KB=2^10字节(B)=1024字节(B)
1MB=1024KB=2^20B
1GB=1024MB=2^20KB=2^30B
1TB=1024GB=2^20MB=2^30KB=2^40B
1.主函数
//单行注释
/*
多行注释
*/
#include <stdio.h> //引用函数,stdio是standard input&output的缩写
int main() //定义主函数
{
int i = 1; //定义变量,赋值为1,等同于int i; i = 1;
printf("%d\n",i); //输出结果,\n是转义字符,用来换行
return 0; //使函数返回值为0
}
//每写完一行代码,记得要ctrl+s保存
2.数据类型
2.1基础数据类型
2.1.1整数
一个字节Byte的位数是8bit
1KB=1024B
1MB=2∧10KB
1GB=1024MB
整型int(4个字节);短整型short int(2个字节);长整型long int(8个字节);
(1)常用数制:
十进制,二进制0b,十六进制0x,八进制0
(2)数制之间的转换:
#include <stdio.h>
int main(void)
{
int a,b,c;
a = 0xB;
b = 015;
c = 0b11;
printf("八进制%d,十六进制%d,二进制%d\n",a,b,c);
int i;
i = 12;
printf("i=%d\n",i);
printf("i=%x\n",i); //十进制输出
printf("i=%#x\n",i); //十六进制小写输出
return 0;
}
/*
在Dev-C++的输出结果是:
----------------------
八进制11,十六进制13,二进制3
i=12
i=c
i=0xc
----------------------
*/
2.1.2浮点数
(实数,不能定点储存)
单精度float(4个字节);双精度double(8个字节);
(1)传统写法:
float x = 1.2;//1.2系统默认为double类型
float x=1.2f;//1.2f/1.2F转化为float类型
(2)科学计数法:
float x=1.2e2; //x=1.2*10^2=1.2*100=120
float x=1.2e-2; //x=1.2*10^(-2)=1.2*0.01=0.012
//e/E前面必须有数字,且e/E后面数字必须为整数
2.1.3字符
char(1个字节)
字符:‘A’,字符串:“AB”,注:可以“A”,但不能用‘AB’
eg:
char i = 'A';
//char i = "AB";错误,字符与字符串之间不能相互赋值
//char i = "A";错误,同上
//char i = 'AB';错误,AB是字符串不能用单引号,只能用双引号
//char i = 'B';错误,变量i已经被定义了,不能重复定义
i = 'C';正确,将C赋值给i
2.1.3.1转义字符

2.1.3.2字符的输入输出
char c=getchar();//输入字符,getchar只能接收一个字符
putchar(c);输出字符
等价于putchar(getchar());或者printf("%c",getchar());
也可以通过字符的ASCII代码输出某个字符
eg: putchar(66);//输出结果为B
putchar可以输出转义字符
putchar('\101');//八进制数101转化为十进制为65,A的ASCII代码为65,输出A
putchar('\'');输出结果为'
2.2*不同类型数据之间相互赋值
int i = 45;
long j = 102345;
i = j;
printf("%ld %d\n", i, j);
float x = 6.6;
double y = 8.8;
printf("%f %lf\n", x, y);
2.3常量的存储方式
(1)整数是以补码的形式转化为二进制代码存储在计算机中
(2)实数是以IEEE754标准转化为二进制代码存储在计算机中
(3)字符的本质与整数的存储方式相同
ASCII是一种规定,规定了不同字符使用哪个整数值去赋值

0:48-9:57
A:65-Z:90
a:97-z:122
eg:
#include <stdio.h>
int main()
{
char i = "A";
printf("%d\n",i)
return 0;
}
//输出结果:
i=65 j=66 m=97 n=98
可知字符A,B,a,b的ASCII代码为65,66,97,98
2.4复合数据类型
(1)结构体
(2)枚举enum
(3)共用体

3.printf&scanf函数的用法
3.1printf函数
%d十进制整数输出控制符 int
%ld long int
%f浮点数输出控制符 float
%lf double
%c字符输出控制符 char
%#x(%X或%x)十六进制输出控制符 int或long int或short int
%#b(%B或%b)二进制输出控制符 同上
%#o(%O或%o)八进制输出控制符 同上
%s 字符串
%e(%E) 指数形式输出
printf("%e",12.3) ;
输出结果:1.23e+1
printf("%5d + %-5d = %10d\n",x,y,a);
%5d 宽域为5右对齐
%-5d 5左对齐
%0.2f 以小数点后两位输出,宽域默认,根据输出结果
printf("%*d",5,a);//宽域为5输出整数a
printf("%*.*d",5,3,a);//宽域为5,位数为3输出整数a
printf("%.*d",3,a);//位数为3输出整数a
printf("%*.d",5,a);//宽域为5输出整数a
eg:
#include <stdio.h>
int main()
{
int i,j;
i = 15;
j = 13.5;
char m = 'A';
int n = 36;
printf("i=%d,j=%f,m=%c,n=%#x",i,j,m,n);
return 0;
}
/*
输出结果:
i=15,j=0.000000,m=A,n=0x24
*/
eg:
#include <stdio.h>
int main()
{
int a, b, sum;
a = 10;
b = 20;
sum = a + b;
printf("和为%d\n", sum);
printf("hello world\n");
return 0;
//求和、格式化输出
}
3.2scanf函数
int a;
scanf("%*c%d",&a);//假设输入a12,则忽略第一个输入的字符,将12赋给a
eg:
#include <stdio.h>
int main()
{
int i,j;//先定义i,i存储在内存中,生成一个地址
printf("请以“i j”的格式输入i和j的值:"); //对用户进行提示
scanf("%d %d",&i,&j); //scanf("%d\n",&i);尽量不要添加非输入控制符,这样写需要在键盘输入时加\n
/*键盘输入的是字符串形式,储存方式为二进制,%d将输入的内容转化为十进制,
&i代表i的地址,&是取址符,将输入的内容赋值给i在内存的地址*/
printf("i=%d\nj=%d\n",i,j);
int k;
k = i+j;
printf("k=i+j=%d",k);
return 0;
}
结果:
请以“i j”的格式输入i和j的值:2 3
i=2
j=3
k=i+j=5
eg:
#include <stdio.h>
int main()
{
int i;
char ch;
scanf("%d",&i);
printf("i=%d\n",i);
while ((ch=getchar())!='\n')
continue;
int j;
scanf("%d",&j);
printf("j=%d\n",j);
return 0;
}
4.运算符
(1)算数运算符
+加,-减,*乘
<1>/除以
当被除数与除数都是整数类型时,两数相除的结果向下取整
16/5==3;16/-5==-4;-16/3==-6;-16/-3==6;
当被除数与除数中只要有一个是浮点数,那么两数相除的结果也是浮点数
16.00/5==3.200000;
<2>%取余数
运算对象都是整数,且运算结果与被除数的符号相同
2%3==2;10%3==1;-10%3==-1;10%-3==1;-10%-3==-1
eg:
#include <stdio.h>
int main()
{
int i = 17;
int j = 3;
int k;
k = i/j;//向下取整
int n = 16;
float m = 3.00;
float a;
a = n/m;
printf("17/3=%d,16/3.00=%f\n", k, a);
printf("16/5=%d,16.00/5=%f\n",16/5,16.00/5);
//取余数
printf("12%5=%d,-12%5=%d,12%-5=%d,-12%-5=%d",12%5,-12%5,12%-5,-12%-5);
return 0;
}
/*
运算结果:
17/3=5,16/3.00=5.333333
16/5=3,16.00/5=3.200000
12=2,-12=-2,12=2,-12=-2
*/
(2)关系运算符
<小于,>大于,<=小于等于,>=大于等于,!=不等于,==等于
(3)逻辑运算符
!(非),&&(并且),||(或)
!真 为 假0
!假 为 真1
真&&假 为 假0
真&&真 为 真1
真||假 为 真1
真||真 为 真1
eg:
#include <stdio.h>
int main()
{
int k = 10;
int m;
m = (3>2) && (k=0);//3>2为真,还需要执行后面的程序,将0赋值给k,k为0则k为假,则m为假
printf("m=%d,k=%d\n",m,k);
int i = 20;
int j;
j = (3>2) && (i=2);//3>2为真,还需执行后面的程序,将2赋值给i,则j为真
printf("j=%d,i=%d\n",j,i);
int a = 3;
int b;
b = (2>3) && (a=6);//2>3为假,因为是并集,则b为假,不用再执行后面的程序
printf("a=%d,b=%d\n",a,b);
int x = 30;
int z;
z = (3>2) && (x==20); //3>2为真,x等于30,则x等于20为假,则z为假
printf("x=%d,z=%d",x,z);
return 0;
}
/*
运行结果:
m=0,k=0
j=1,i=2
a=3,b=0
x=30,z=0
*/
(一假则假)&&当第一个表达式为假时,则不用再执行后面的表达式,整个表达式为假
(一真则真)||当第一个表达式为真时,则不用再执行后面的表达式,整个表达式为真
语句是表达式和分号
(4)赋值运算符
=,a+=b(a=a+b),-=,/=,*=,%=
优先级:
初等运算符>单目运算符(非)>算数>关系>逻辑运算符(不包括非)>条件运算符>赋值>逗号运算符
1.算数(自左向右,左结合)
*,/,%相同,高
-,+相同,低
2.关系运算符(自左向右,左结合)
<,>,<=,>=优先级相同(高)
==,!=优先级相同(低)
错误写法: if(a>b>c)
正确写法: if(a>b&&b>c)
3.逻辑运算符(自左向右)
!>&&>||
(1)a&&b&&c
只有当a为真时才进行b和c的运算
(2)a||b||c
只有当a为假时才进行b和c的运算
4.赋值运算符(自右向左,右结合)
=,+=,-=,*=
b=1;
a=b+=5;//a=6
5.单目运算符(!,-,++)(自右向左)
a=++i;先i=i+1,再a=i
a=i++;先a=i,再i=i+1
同一级别下,自右向左结合
-i++相当于-(i++)
6.初等运算符(自左向右)
(),[],->,·
条件运算符(三目运算符)
(?,:)(自右向左)
a>b?(max=a):(max=b);
max=(a>b)?a:b;
a>b?printf("%d",a):printf("%d",b);
5.流程控制
5.1if流程
5.1.1if格式
#include <stdio.h>
//文件名后缀默认为.cpp,尽量不要用含.的名称来命名文件
int main()
{
if (3)//除了0都为真
printf("a\n");//输出
if (0)//假
printf("b\n");//不输出
if (0==0)//真
printf("c\n");//输出
if (0);//这里加了分号,成为一个单独的语句
printf("d\n");//会输出,因为这是一个单独的输出语句,不在if流程里
if (1<2)
printf("1执行\n");
printf("2执行\n");
if (1>2)
printf("3执行\n");
printf("4执行\n");
if (1>2)
{
printf("5执行\n");
printf("6执行\n");
}
if (2>3)
printf("aaa\n");
else
printf("bbb\n");
printf("ccc\n");
return 0;
}
/*
运行结果:
a
c
d
1执行
2执行
4执行
bbb
ccc
*/
5.1.2if-else
#include <stdio.h>
int main()
{
int i;
printf("请输入i的值:");
scanf("%d",&i);
if (70>i>100)
printf("aaa\n");
else if (40<i<70)
printf("bbb\n");
else
printf("ccc\n");
return 0;
}
/*
无论i为何值都只输出bbb,
因为70>i为真或假即0或1,
显然0或1都小于100,
则70>i>100一定为假;
又因为40<i为真或假即0或1,
则40<i<70一定为真
*/
5.1.3if流程例子
#include <stdio.h>
int main()
{
float i;
printf("请输入您的成绩:");
scanf("%f", &i);
if (i>100)
printf("做梦\n");
else if (i<=100 && i>=90)//不能用90<i<=100,无论输入任何值都为真
printf("优秀\n");
else if (i<90 && i>=80)
printf("良好\n");
else if (i>=60 && i<80)
printf("及格\n");
else
printf("成绩不及格\n");
return 0;
}
5.1.4求解一元二次方程
#include <stdio.h>
int main()
{
printf("x*x+2x+3=0\n");
float a, b, c;
a = 1;
b = 2;
c = 1;
float d;
d = b * b - 4 * a * c;
if (d > 0)
{
float x1=(-b + sqrt(d)) / (2 * a);
float x2=(-b - sqrt(d)) / (2 * a);
printf("x1=%f\nx2=%f\n", x1, x2);
}
else if (d=0)
{
printf("有一解\n");
}
else
{
printf("无解\n");
}
return 0;
}
5.1.5变量值互换
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 3;
int t;//定义一个临时变量
t = i
i = j;
j = t;
return 0;
}
5.1.6求最大值并排序
冒泡排序
选择排序
#include <stdio.h>
int main()
{
int i,j,k;
printf("请以空格分开输出三个数:");
scanf("%d %d %d",&i,&j,&k);
//求最大值
if (i>=j && i>=k)
printf("%d\n",i);
else if (j>=i && j>=k)
printf("%d\n",j);
else
printf("%d\n",k);
//将三个数按从大到小排序
if (i>=j)
{
if (j<k)
{
int t;
t=j;
j=k;
k=t;
if(i<j)
{
int f;
f=i;
i=j;
j=f;
}
}
}
else
{
int a;
a=i;
i=j;
j=a;
if (j<k)
{
int b;
b=j;
j=k;
k=b;
}
if (i<j)
{
int c;
c=i;
i=j;
j=c;
}
}
printf("%d %d %d\n",i,j,k);
return 0;
}
#include <stdio.h>
int main()
{
int a,b,c,d;
printf("请以空格隔开输入4个整数:");
scanf("%d%d%d%d",&a,&b,&c,&d);
if (a<b)
{
int t;
t=a;
a=b;
b=t;
}
if (a<c)
{
int i;
i=a;
a=c;
c=i;
}
if (a<d)
{
int k;
k=a;
a=d;
d=k;
}
if (b<c)
{
int j;
j=b;
b=c;
c=j;
}
if (b<d)
{
int p;
p=b;
b=d;
d=p;
}
if (c<d)
{
int q;
q=c;
c=d;
d=q;
}
printf("%d %d %d %d",a,b,c,d);
return 0;
}
5.2for循环
5.2.1求1-100之间3的倍数的和
#include <stdio.h>
//求1到100之间能被3整除的数字和
int main()
{
int i,sum;
sum=0;
for (i=3;i<=100;i+=3)
sum+=i;
printf("sum=%d",sum);
return 0;
}
5.2.2for循环流程
#include <stdio.h>
int main()
{
int i,sum;
sum=0;
for (i=1;i<=4;i+=2)//++i即i+=1
{
printf("aaa\n");
sum+=i;
}
/*
i=1<=4,sum=0+1=1,i=1+2=3
i=3<=4,sum=0+1+3=4,i=3+2=5
i=5>4
进行了两次循环
*/
printf("%d",sum);
return 0;
}
#include <stdio.h>
int main()
{
int i,sum;
sum = 0;
for (i=3;i<=10;++i)
{
if (i%3==0)
sum+=i;
printf("sum=%d\n",sum);
}
return 0;
}
运行结果:
sum=3
sum=3
sum=3
sum=9
sum=9
sum=9
sum=18
sum=18
5.2.3求奇数和
//求1-100内奇数和、偶数和,以及奇数的个数和平均值
#include <stdio.h>
int main()
{
int i,sum1,sum2,c;
sum1=0;
sum2=0;
c=0;
for (i=1;i<=100;++i)
{
if (i%2!=0)
{
sum1+=i;
c+=1;
}
else
sum2+=i;
}
float avg;
avg = 1.0*sum1/c;
printf("奇数和%d,偶数和%d,奇数个数%d,平均数%f",sum1,sum2,c,avg);
return 0;
}
5.2.4强制类型转换
求1+1/2+1/3+…+1/100的和
#include <stdio.h>
int main()
{
int i;
float sum;
sum=0;
for (i=1;i<=100;++i)
{
sum+=1/(float)(i);
//sum+=1.0/i;
//错误写法sum+=(float)(1/i); 1和i都是整数,运算结果向下取整为0,当1和i至少有一个为浮点数时,1/i的结果为1除以i的浮点数
}
printf("%f\n",sum);
return 0;
}
5.2.5循环中更新的变量不能定义成浮点型
计算机组成原理,浮点数的存储和表示
整数是以二进制补码储存,浮点数是以编码储存
浮点型不能精确存储一个小数
判断浮点数是否为0
if (|i-0.00001|<=0.00001)
为0
else
不为0
循环时更新的变量不能定义为浮点型
#include <stdio.h>
int main()
{
float i;
float sum;//错误
sum=0;
for (i=1.0;i<=100;++i)
{
sum+=1/i;
}
printf("%f\n",sum);
return 0;
}
5.3while循环
5.3.1do while循环
#include <stdio.h>
#include <math.h>
int main()
{
double a, b, c;
double x1, x2;
double d;
char ch;
do
{
printf("请输入一元二次方程的三个系数:\n");
printf("a = ");
scanf("%lf", &a);
printf("b = ");
scanf("%lf", &b);
printf("c = ");
scanf("%lf", &c);
d = b*b - 4*a*c;
if (d > 0)
{
x1 = (-b + sqrt(d)) / (2*a);
x2 = (-b - sqrt(d)) / (2*a);
printf("x1 = %lf, x2 = %lf\n", x1, x2);
}
else if (0 == d)
{
x1 = x2 = (-b) / (2*a);
printf("x1 = x2 = %lf\n", x1);
}
else
{
printf("无解\n");
}
printf("是否继续y/n:");
scanf(" %c", &ch);//%c前面必须加空格
}while ('y' == ch || 'Y' == ch);
return 0;
}
5.3.2while
5.4switch
# include <stdio.h>
int main()
{
int val;
printf("输入楼层:");
scanf("%d", &val);
switch (val)
{
case (1):
printf("1层\n");
break;
case (2):
printf("2层\n");
break;
case (3):
printf("3层\n");
break;
default:
printf("没有\n");
break;
}
return 0;
}
如果没有break,当val=3时会执行语句3和4
switch(a)
{
case 'A':printf("a");
case 'B':printf("b");break;
default:printf("c");
}
当a='A'时,输出ab
switch(a)
{
case 'A':printf("a");
default:printf("c");
case 'B':printf("b");
}
当a='C'输出结果:cb
当a='B'输出结果:b
5.5break和continue
5.5.1break
用来终止循环和switch,且break只能终止离它最近的循环
不能直接用于终止if,除非if属于循环内部的子句,且break终它止的是if外部的循环
5.5.2continue
跳出本次循环,contibue后面的语句不再执行,进行下一次循环
# include <stdio.h>
int main()
{
int i, sum;
i = 0;
sum = 0;
do
{
if (i % 2)
{
++i;
continue;//跳到17行,跳出本次循环,继续下一次循环
}
++i;
sum += i;
}while(i < 5);//17行
printf("%d", sum);
return 0;
}


6.数组
6.1一维数组
int a[10];
a[10]={1,2,3};
各个元素依次可用a[0],a[1],a[2]…来表示
等价于int a[10]={1,2,3};
也可不进行定义元素的个数,例如:int a[]={1,2,3};//此时系统会自动分配3个整型变量的存储空间给数组a的地址
6.2二维数组
int a[2][3]={1,2,3,4,5,6};//实际存储方式
//可以看做是2个一维数组的数组,a[0],a[1]可以看做是一维数组名,得到2行3列的矩阵,等价于int a[2][3]={{1,2,3},{4,5,6}};
也可对数组中某些元素不进行赋值,其元素值则为0
int a[2][3]={{1},{1,2,3}}
元素值为
1 0 0
1 2 3
对于二维数组必须要定义数组的列数
int a[][3]={1,2,3,4,5,6};
等价于int a[2][3]={1,2,3,4,5,6};
元素值为
1 2 3
4 5 6
多维数组
6.3字符数组
char c[4]={'y','y','d','s'}; //也可以省略数组长度,系统会自动根据元素个数确定数组长度为4,输出可以用printf("%s",c);
char c[]={'y','y','d','s'};长度自动确定为4
char c[5]={'y','y','d','s'};
没有赋值的元素c[4]='\0'
char a[][3]={{'*',' ',' '},{' ','*'}};
当程序遇到\0时就终止输出了
输出用for循环逐个元素输出结果
字符串赋值的错误写法
int main()
{
char c[20];
c= {"you"};//error,c是地址常量,不能改变它的值
char str[10]={"you"};
c=str;//错误,原因同上
printf("%s",c);
return 0;
}
正确写法
int main()
{
char c[20];
strcpy(c, "you");
printf("%s", c);
return 0;
}
int main()
{
char c[20]={"you"};
printf("%s", c);
return 0;
}
6.3.1字符串结束标志
printf("a");系统会在a后面加一个'\0',作为字符串结束标志,遇到'\0'输出就结束了
char c[]={"yyds"};//长度为5,等价于char c[]={'y','y','d','s','\0'};而不等价于char c[]={'y','y','d','s'};
char b[6]={"yyds"};
元素b[0]到b[5]为'y','y','d','s','\0','\0'
字符串输出printf("%s",c);
字符串输入
输入的字符串应短于已定义的字符数组的长度
char c[10];
scanf("%s",c);
错误写法
char c[];//需要给数组c确定长度,才能给c分配地址
scanf("%s",c);
char str[]={"ok"};
strcpy(c,str);//错误,原因同上
6.3.2字符串使用的有关函数
使用函数前要写#include<string.h>
1)puts(str)输出字符串
char str[]={"China\nBeijing"};
puts(str);
2)gets(str)输入字符串
char str[20];
gets(str);
从键盘上输入的字符串回车后,赋值给str
3)strcat(str1,str2)连接两个字符串
把str2里的元素加到str1数组后面,结果放在str1数组里,返回str1数组的地址,但不改变str1和str2字符数组的元素
char str1[10]={"you"};
char str2[]={"and"};
char *str=strcat(str1,str2);
puts(str);
//str的地址是str1的地址,长度与str1相同,str[10]={'y','o','u','a','n','d','\0','\0','\0','\0'}
printf("%s",strcat(str1,str2));
输出结果为youand
4)strcpy(str1,str2)字符串复制函数
将字符数组str2的元素复制到字符数组str1中,str1字符数组完全变成str2字符数组的字符串,str2不变
char str1[5],str2[]="ok";
strcpy(str1,str2);
str[10]={'o','k','\0','\0','\0'}
strcpy(str1,"ok");
5)strncpy(str1,str2,n)
将str2中最前面n个字符复制到str1中,取代str1中原有的最前面n个字符
strncpy(str1,str2,n);//n<=str1中字符元素个数(不包括'\0')
6)strcmp(str1,str2)字符串比较函数
strcmp("yes","no");
strcmp(str1,str2);
strcmp(str1,"Beijing");
比较规则
从左至右逐个通过ASCII代码大小比较,直到遇到不同的字符或遇到'\0'为止
1.当两个字符串相同时,函数值为0
2.当str1>str2时,函数值为一个正整数
3.当str1<str2时,函数值为一个负整数
7)strlen函数
测量字符串长度的函数,函数值为字符串数组中字符元素的个数(不包括'\0')
char str[10]={"ok"}
int x=strlen(str);//x的值为2
x=strlen("ok");//x=2
7.strlwr(str)
strupr(str)
fgets
fputs
6.3.4二维字符数组
char str[3][20];
7.函数
递归
变量
全局变量
局部变量
自动变量auto
静态变量static
#include <stdio.h>
int main(void)
{
int f(int);
int a=2,i;
for(i=0; i<3; i++)
printf("%d\n",f(a));
//printf("%d",c);
return 0;
}
int f(int a)
{
auto int b=0;
static int c=3;
//c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
输出结果
7
8
9
外部变量extern
函数变量是数组
字符数组函数
gets()
strlen()
8.指针
二维数组指针
以指针为形参的函数
函数的指针
字符数组指针
以字符数组指针为形参的函数
指针的指针
通过指针引用字符串
molloca动态数组
9.枚举
eumn
10.结构体
10.1定义的三种方式
1.
#include <stdio.h>
struct Date
{
int year;
int month;
int day;
};
int main()
{
struct Date a={2024,6,19};
}
2.
struct Date
{
int year;
int month;
int day;
}a={2024,6,19};
3.
struct
{
int year;
int month;
int day;
}a={2024,6,19};
也可以只对某一变量赋值
struct Date a={.day=19};
等价于struct Date a;a.day=19;
输出结构体变量成员
printf("%d",a.day);
输入结构体变量成员的值
scanf("%d",&a.day);
10.2结构体中的结构体
struct Student
{
char name[20];
struct Date birthday;
}st={.name="Tom"};
st.brithday.year=2024;
10.3结构体内部的数组成员
struct Student
{
char name[20];
float score[3];
};
struct Student st;
st.score[0]=68.9;
10.3元素类型为结构体的数组
struct Student
{
char name[20];
int age;
};
struct Student st[3];
st[0].age=12;
10.4指向结构体的指针
struct Student
{
char name[20];
int age;
};
struct Student st={"Tom",12} ;
struct Student *p=&st;
//以下三种方式等价
(*p).age=19;
p->age=20;
st.age=21;
10.4以结构体变量为参数的函数
struct Student
{
char name[20];
int age;
};
void f(struct Student t)
{
t.age=12;//形参不影响实参的值
}
struct Student st={"Tom",19} ;
f(st);
printf("%d",st.age);//输出结果为19
10.4以结构体指针变量为参数的函数
struct Student
{
char name[20];
int age;
};
struct Student st={123,"Tom"};
f(&st);
int f(struct Student * p)
{
(*p).num=013;
}
10.3链表
10.4typedef
11.共用体
12.文件
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)