学习C语言的第七天

发布时间 2023-04-12 21:12:33作者: 林奇老师

  因为一些身体的原因,连续几天的感冒和发烧,故多天只每天学习了一个小时不到,今天将这几天的学习整理在一起

一.字符串

1.1可以说就是字符数组   

            1.和整型一样---int data[] = {1,2,3,4};
            2.和整型数组一个道理--char str[] = {'h','e','l','l','o'};
            3.改进---char str[]="hello";
            4.一般用char *p="hello";

            3和4的区别  3是字符串变量
                   4是字符串常量--不允许被修改
                   注意指针的操作  保存地址可以--修改指向--指向字符串常量的地址空间

                            对野指针的内存空间操作不行

#include<stdio.h>

int main()
{    
    int data[] ={1,2,3,4};
    char cdata[] = {'h','e','l','l','o'};
    char cdata2[] = "hello";
    char *pchar = "hello";
    
    cdata2[3] = 'm';
    printf("%s",cdata2);
    putchar('\n');
    puts(cdata2);
    
    
    
    return 0;;
}

1.2和整型数组在存储上的区别

  回忆如何计算数组的大小及数组元素的个数
  字符串的存储方式--多了结束标志'\0'

#include<stdio.h>

int main()
{    
    int data[] ={1,2,3,4};
    char cdata[] = {'h','e','l','l','o'};
    char cdata2[] = "hello";
    
    int lenData = sizeof(data)/sizeof(data[0]);
    int lenCdata = sizeof(cdata)/sizeof(cdata[0]);
    int lenCdata2 = sizeof(cdata2)/sizeof(cdata2[0]);
    
    printf("data的长度为:%d\n",lenData);
    printf("cdata的长度为:%d\n",lenCdata);
    printf("cdata2的长度为:%d\n",lenCdata2);
    
    return 0;
}

1.3sizeof和strlen的区别

#include<stdio.h>
#include <string.h>

int main()
{    
    char cdata[128] = "hello";

    
    printf("sizeof:%d\n",sizeof(cdata));
    printf("strlen:%d\n",strlen(cdata));
    
    return 0;
}

1.4动态开辟字符串

  malloc 函数原型 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针
  realloc 函数原型 void *realloc(void *ptr,size_t size) 扩容
  free   释放,防止内存泄漏
      防止悬挂指针,

#include<stdio.h>
#include <stdlib.h>
#include<string.h>

int main()
{    
    char *p;
    p = (char *)malloc(1);
    *p = 'c';
    free(p);
    p = (char *)malloc(12);
    printf("扩容地址:%x\n",p);
    int len = strlen("zhangchaobo45452124544");
    int newLen = len - 12 + 1;
    realloc(p,newLen);
    printf("扩容后的地址为:%x\n",p);
    strcpy(p,"zhangchaobo45452124544");
    puts(p);
    puts("end");
    
    return 0;
}

1.5几种字符串常见api

  输出字符串   puts
          printf
  获取字符串   gets   char * gets(char * str)
               因为本函数容易可以无限读取,易发生溢出
          scanf

  计算长度      sizeof
         strlen
  拷贝        strcpy
            strncpy

1.6自己写拷贝函数

#include<stdio.h>

char* myStrcpy(char *des,char *src)
{
    if(des ==NULL || src == NULL){
        return NULL;
    }
    cahr *bak = des;
    if(src != '0'){
        *des = *src;
        des++;
        src++;
    }
    *des = '\0';
    return bak;
}


int main()
{    
    char str[128] = {'\0'};
    char *p = "zhangchaobo handsome";
    myStrcpy(str,p);
    puts(str);
    
    return 0;
}

1.7断言assert  用法:如果判断为假,抛出错误信息

1.8拼接 strcat

#include<stdio.h>
#include <string.h>

int main()
{    
    char str[128] = "zhangchaobo";
    char *p = "handsome";
    strcat(str,p);
    puts(str);
    
    return 0;
}