《郝斌C语言自学教程》_哔哩哔哩_bilibili

基础知识:

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.文件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐