C语言结构体整理

本文详细介绍了C语言中的字符串概念,包括以0结尾的字符数组、字符串变量与常量的区别、字符串数组的使用,以及空字符串的表示。同时,讲解了如何通过数组和指针操作字符串,如strlen、strcmp、strcpy和strcat等函数的使用。此外,还探讨了枚举类型在C语言中的应用,以及结构体的声明、成员访问和结构作为函数参数的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串

  • 以0结尾的一串字符

  • 0或'\0'等价但是与'0'不同

  • 0标志着字符串的结束,但它不是字符串的一部分,故计算字符串长度的时候不包括0

  • 字符串以数组的形式存在,可以以数组或指针的形式访问(指针居多)。

字符串变量

char *str ="hello";
​
char word[] ="hello";
​
char line[10]="hello";
​

字符串常量

  • "hello"会被编译器编译成一个字符数组,这个数组的长度为6,(结尾是表示结束的0)

  • 两个相邻的字符串(中间没有其他符号)会被连接起来 char*s="Hiello,world!";这里的S是一个指针,初始化为指向一个字符串常量 。

  • 不要对S所指的字符串做写入:S[0]=x;

  • 如果需要修改字符串,应该用数组:char S[]="Hello,world!";

数组:字符串在这里作为本都变量空间自动被回收

指针:不知道字符串的位置

一般用作处理参数和动态分配空间

因此

构造字符串用数组

处理字符串用指针

<!--只有char*所指的字符数组有结尾0,才能说它所指的是字符串-->

空字符串

  • char buffer[100]="";

表示这是一个空的字符串,buffer[0]=='\0

  • char buffer[]="";

表示这个数组的长度只有1!

字符串数组

  • char **a a是一个指针,指向另一个指针,那个指针指向一个字符(串)

  • char a (二维数组要有确定的大小)

或者a[]={} 其中a[0]相当于char

<!--switch语句可以用字符串数组写-->

单字符的输出与输入

int putchar(int c);

输出一个字符

当输出不能用了会返回EOF

int getchar(void);

从标准输入读入一个字符

string.h

  • size_t strlen(const char *s);

    返回S的字符串长度(不包括结尾的0)

    <!--sizeof(x)中包括结尾的0-->

  • strcmp

  • int strcmp(const chars1, const chars2);

  • 比较两个字符返回

    1. 0:s1==s2

    2. 1:s1>s2

    3. -1:s1<s2

返回两个不相等字符的差值。

  • strcpy

  • charstrcpy(char * restrict dst, const char *restrict src);

  • 把src的字符串拷贝到dst

  • 返回dst

    复制字符串

    char * dst =(char * )malloc(strlen(src)+1);

    strcpy(dst,src);

  • strcat

  • char * strcat(char * restrict s1,const char * restrict s2);

  • 将S2拷贝到S1的后面,接成一个长的字符串

  • 返回S1

  • 注意S1必要有足够空间

枚举法

  • 枚举使用户定义的数字类型,它用关键字 enum以如下语法来声明:

  • enum+名字{名字1 名字2.......}

  • 大括号里面的名字是字符常量,它们的类型是int,值则依次从0到n:

  • enum colors{red,yellow,green};

    #include <stdio.h>
    enum color{red,yellow,green};
    int main(int argc,char const *argv[])
    {
        int color=-1;
        ,char *colorname=MNLL;
        scanf("%d",&color);
        switch(color)
        {
            case red:colorname="red";break;
            case yellow:colorname="yellow";break;
            case green:colorname="green";break;
            defauit: colorname="unknown";break;
        }
        printf("你喜欢的颜色是%s\n",colorname);
        return 0;
    }
  • 枚举的量可以用作值

  • 枚举类型可以跟上enum作为类型

  • 实际上enum可以看作int来对数据进行输出输入

    #include <stdio.h>
    enum color{red,yellow,green};
    void f(enum color c);
    int main(void)
    {
        enum color t =red;
        scanf("%d",$t);
        f(t);
        return 0;
    }
    void f(enum color c)
    {
    printf("%d\n",c);
    }

结构类型

声明结构类型

  • struct date

  • 函数内部声明的结构只能在函数内部使用,在外部声明结构类型就可以被多个函数使用。

声明结构的形式

1.

struct point{
    int x;
    int y;
};
struct point p1,p2;

2.

struct point{
    int x;
    int y;
}p1,p2;

3.

struct {
    int x;
    int y
}p1,p2;

  • 1.和2.中都声明了结构point并且定义了变量,3.中只是定义了两个变量。

结构成员

  • 结构与数组有点像

数组中有很多单元;结构里面有很多成员。但数组的单元必须是相同类型的,而结构的成员不一定是相同的。

  • 数组用[]运算符和下标访问其他成员:a[0]=10;

  • 结构用'.'运算符和名字访问其他成员:pl.x today.day;

结构运算

  • 要访问整个结构,直接用结构变量的名字

  • 可以对整个结构做赋值,取地址,也可以传递给函数参数

例如: (数组不可以做如下运算)

  1. pl=(struct point){5,10};

  2. 相当于pl.x=5;pi.y=10;

  3. pl=p2;

  4. 相当于pl.x=p2;pl.y=p2.y;

  • 结构变量的名字并不是结构变量的地址,必须使用&运算符

struct date *pDate=&today;

结构作为函数参数(与数组不同)

  • int numberofdays(struct date d)

  • 整个结构可以作为参数的值传入函数。,此时是在函数内新建一个结构变量,并复制调用的值

  • 也可以返回一个结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShasHashALU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值