C语言基础在路上 (字符串-结构体)

C语言基础

字符串

  • 字符串:由多个字符构成,最后一个字符必须要是'\0'
  • 字符数组:由多个字符构成
  • 表达方式
    1. char str[10]={'a','b','c'};
    2. char str[10]={"hello"};
    3. char str[10]="hello";
    char str[10]="hello";
    str[2]='m';
    
    • hello存放在文字常量区,但是str扯个字符串存在栈区,度文字常量区的内容进行了拷贝,所以可修改str里的字符创里的变量。
    1. char *p="hello";
      • 用p[2]='m'会出错,因为文字常量区常量字符串只读不可更改
    char *p="hello";
    char *q="hello";
    printf("p=%p,q=%p",p,q)//结果相同
    
    char *p="hello"
    printf("%c\n",*(p++));//h
    printf("%c\n",*p);//e
    
    char *p="hello"
    p++;
    printf("%s\n",*p);//ello
    
    
    #include <stdio.h>
    int main()
    {
        char *p="abcde";
        printf("%c\n",*p);
        printf("%c\n",*p++);
        printf("%c\n",*p);
        printf("%c\n",*p++);
        printf("%c\n",*p);
        printf("%c\n",*(p++));
        printf("%c\n",*p);
        printf("%c\n",*(p++));
        printf("%c\n",*p);
    }//aabbccdde
    
    • 在栈区定义恩恩一个指针p指向了文字常量区的内容,所以不可以用p对文字常量区的内容进行更改。
    1. printf是以\0结束的
  • 字符串长度的计算
    • strlen():计算\0之前的字符,不包括\0这个字符。包含头文件#include <string.h>。
    char str[10]="hello";
    long int lengh=strlen(str);
    printf("lengh=%ld\n",lengh);
    
    自己写一个strlen的函数
    #include <stdio.h>
    void mystrlen(int *lengh,const char *str) 
    {
         while(*str!='\0')
         {
              *lengh+=1;
              str++;
         }
    }
    int main()
    {
        int l=0;
        char str[10]="hello";
        mystrlen(&l,str);
        printf("%d\n",l);
    }
    
  • 字符串的拷贝
    • strcpy():将右边的字符串完全拷贝到左边的字符串里。而不是覆盖一小部分。
    char str1[10]="hello";
    char str2[10]="asdaf";
    strcpy(str2,str1);
    
    
      - 注意的问题:
      1. 左边字符串的大小必须要大于右边字符串的大小
      2. 左边的字符串不能使使用char *p定义出来的。
    
    • strncpy():替换字符串前面的字符
    #include <stdio.h>
    #include <stdio.h>
    int main()
    {
        char str1[20]="helloasas";
        char str2[20]="asaaaworld";
        strncpy(str1,str2,5);
        printf("%s\n",str1);
    }
    
  • 字符串的比较
    • strcmp(str1,str2),如果两字符串相同,结果为0.
    char str1[10]="hellb";
    char str2[10]="hella";
    strcmp(str1,str2);
    
    
      - 如果左边的字符串>右边的字符串,结果是(左边不同字符ascii码减右边对应位置字符ascii码)
      - 如果编译器低级
          - 左>右,结果=1
          - 右>左,结果=-1
    
    • strncmp(str1,str2)
    #include <stdio.h>
    int main()
    {
        char str1[20]="helloasas";
        char str2[20]="hellaworld";
        int result=strncmp(str1,str2,5);
        printf("%d\n",result);o-a
    }
    
  • 字符串链接函数
    • strcat:会将右边字符串拼接到左边的后面
    char str1[10]="hello";
    char str2[10]="world";
    strcat(str1,str2);
    
      - 注意:左边的字符串要足够大。
    
    • strncat():只连接目标行数
    #include <stdio.h>
    int main()
    {
        char str1[20]="helloasas";
        char str2[20]="helloworld";
        strncat(str1,str2,5);
        printf("%d\n",str1);//helloasashello
    }
    

字符串数组

  • char str[2][10]={"hello","world"}
  1. 指针数组
char *p="123";
char *p1="nihao";
char *str[2]={p,p1};//*str1[2]={"123","hihao"};

程序内存空间分配

  1. 栈区:存储局部变量
  2. 静态区(全局区):静态变量,全局变量
  3. 堆区:存放由程序员调用malloc函数时分配的空间。
  4. 文字常量区:常量字符串(只读不能更改)
  5. 代码二进制:代码

结构体类型

  • 可以将不同数据类型组合在一起的集合
  • 定义方法
struct 结构体名
{
    属性变量;(特征变量)
}
struct Person
{
    char name[10];
    char sex;
    int height;
    float score;
};
struct Person//两个加起来算一个数据类型。
//结构体变量的定义
struct Person person;
  • 结构体变量初始方法
    • .代表‘的’意思。
person.sex='m';
strcpy(person.name,"xxxx");
person.height=180;
person.score=100;
printf("sex=%c\nname=%s\nheight=%d\nscore=%f\n",person.sex,person.name,person.height,person.score);
  • 初始化方法2
struct Person person={"xxx",'w',180,100}
  • 初始化方法3
struct Person person2=person;
  • 内存对齐:
    • 如果结构体里的成员变量都是基本数据类型的成员,那么第一个成员的变量内存从内存偏移量为0的位置,后面的成员变量从内存偏移量是他本身字节数的倍数开始分配。
    • 如果结构体成员变量里面是集合类型,数组,结构体,枚举,那么成员变量。比如struct xxx{char ch,Int score}那么该结构体成员从内存偏移量是该结构体里面最大字节数的成员变量的倍数开始分配。
    • 最后收尾的时候,总的字节数是最大成员变量(字节数)的倍数.
struct Person
{
    char sex;//0
    int height;//4--7
    char ch;8(得9,根据条件3奥球倍数,所以为12)
};
struct Person
{
    char sex;//0
    char ch[10];//1--10
    int height;//12--15
};

printf("%d",sizeof(struct Person));
  • 包含结构体的内存对齐
#include <stdio.h>
int main()
{
    struct Birthday
    {
        int year;//0-3
        int month;//4-7===double month//8-15
        int day;8-11======//16-19=>24
    };
    struct Person
    {
        char name[10];0-9
        int score;12-15
        char sex;16
        struct Birthday birth;20-31//32====24-47=>48
    };
    struct Person person={"xxx",100,'m',{1990,1,1}};
    printf("person.name=%s,birthday=%d/%d/%d\n",person.name,person.birth.year,person.birth.month,person.birth.day);
}
  • 无名结构体
struct 
{
    int a;
    char b;
}xx,xx1;
  • 定义这个结构体数据类型的同时定义出来一个变量
struct Student
{
    int score;
    char sex;
}stu1[2]={{12,'m'},{13,'w'}};
  • 结构体和指针的关系
struct Person;
{
    int height;
    char sex;
    
};
struct Person person;
struct Person *p=&person;
(*p).sex='m'
(*p).height='120'
printf("sex=%c,height=%d\n",person.sex,person.height);
p->sex='m'
p->height='120'
printf("sex=%c,height=%d\n",person.sex,person.height);
  • 将现有的数据类型定义成想要的数据类型
    • typedef
    • typedef struct Person Person
    • typedef struct Person * Pstu
    typedef struct Stu
    {
        char name[10];
        int num;
    }Stu(改结构体名),* Pstu;
    
    struct Student
    {
        char name[10];
        int num;
    };
    typedef struct Student Student;
    Student stu{"xx",10};
    printf("name=%s\nnum=%d\n",stu.name,stu.num);
    
  • 数据类型的定义我们一般放在函数的外面供全局使用。
  • 结构体数组
typedef struct Stu
    {
        char name[10];
        int num;
    }Stu;
int main()
{
    int i;
    Student stu[4]={{"xx",123},{"xx1",123},{"xx",122},{"xx2",124}}
    for(i=0;i<4;i++)
    {
        printf("stu[%d].name=%s,stu[%d].num=%d",i,stu[i].name,i,stu[i].name);   
    }
}

//编写程序比较结构体名字的大小进行排序

#include <stdio.h>
typedef struct Stu
    {
        char name[10];
        int num;
    }Stu;
int main()
{
    int i,t;
    Stu temp;
    Stu stu[4]={{"xx3",123},{"xx1",123},{"xx4",122},{"xx2",124}};
    for(i=0;i<4;i++)
    {
        printf("stu[%d].name=%s,stu[%d].num=%d\n",i,stu[i].name,i,stu[i].num);   
    }
    for(i=0;i<3;i++)
    {
        t=strcmp(stu[i].name,stu[i+1].name);
        if(t>0)
        {
            temp=stu[i];
            stu[i]=stu[i+1];
            stu[i+1]=temp;
        }
    }
    for(i=0;i<4;i++)
    {
        printf("stu[%d].name=%s,stu[%d].num=%d\n",i,stu[i].name,i,stu[i].num);   
    }
}
  • 什么时候形参使用传地址:
    • 在其他的函数空间访问另外一个函数空间里面的数据时,并且是要改变这个内容时。
#include <stdio.h>
struct student
{
    int num;
    char name[10];
};
void changevalue(struct student *p)
{
    (*p).num=8;
}
int main()
{   
    struct student stu;
    stu.num=2;
    changevalue(&stu);
    printf("%d\n",stu.num);
}

//练习:自定义一个结构体数组,对数组里面的信息进行自动输入赋值,再利用选择排序进行整理

struct Student
{
    char name[10];
    int num;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容