字符串----C语言下篇---88-96

96 阅读8分钟

字符串

看一看,总的来说,图片所得很清楚了

image.png 代码上一哈,你们看的更清楚

#include <stdio.h>
void main()
{
    int i;
    char a[] = {'s','m','a','l','l'};
    char a2[] = "small";//可以修改
    char *pchar = "small";//字符串常量,不允许修改
    
    a2[2] = 'e';
    //遍历方法
	puts(a);
    printf("%s\n",a2);
    //遍历方法
    puts(pchar);
    //遍历方法
    for(i = 0;i < 5;i++){
        printf("%c",a[i]);
         //printf("%c",a2[i]);
         //printf("%c",*(pchar+i));
    }
}

image.png

字符串的的内存存放方式及结束标志

都是概念
记住 是以 "\0" 结尾
在你打印字符串长度的时候有可能会出错呦

sizeof和strlen 的区别

区别sizeof 函数strlen 函数
作用返回内存中一个变量或类型所占用的字节数返回一个字符串的长度,不包括字符串末尾的空字符
参数可以接受任何类型的参数,包括变量、常量、类型名等只能接受一个字符串作为参数,不能接受其他类型的参数
计算方式在编译时计算,返回变量或类型的字节数在运行时计算,从字符串开头开始扫描,直到遇到空字符为止
返回值返回一个整数,表示变量或类型在内存中所占用的字节数返回一个整数,表示字符串中字符的个数,不包括空字符
用途用于计算数据类型或变量在内存中所占用的空间大小用于获取字符串的长度,通常用于字符串处理中

上代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[223] = "small";
    printf("sizeof :%d\n",sizeof(a));
    printf("strlen :%d\n",strlen(a));
	
	char *p = "small";
	printf("sizeof :p         :%d\n",sizeof(p));
	printf("sizeof :char *    :%d\n",sizeof(char *));
	printf("sizeof :int *     :%d\n",sizeof(int *));
	printf("sizeof :char      :%d\n",sizeof(char));
        printf("strlen :          :%d\n",strlen(p));
}

image.png

清楚明白❤💕

动态开辟字符串(malloc)

废话先上:

函数名malloc()
功能在堆内存中动态分配指定大小的内存空间
头文件stdlib.h
原型void *malloc(size_t size);
参数size:需要分配的内存大小(以字节为单位)
返回值返回一个指向 void 类型的指针,指向分配的内存空间的首地址;如果内存分配失败,则返回 NULL
注意事项malloc() 函数只分配内存空间,但不会进行初始化。使用完毕后,应该使用 free() 函数来释放
内存空间。

相关API:

API描述例子
malloc(size)动态分配内存,创建指定大小的字符串存储空间char *str = (char*)malloc(sizeof(char) * 20);
realloc(ptr, new_size)重新分配内存,增加或减少字符串存储空间str = (char*)realloc(str, sizeof(char) * 30);
strcpy(dest, src)复制字符串 src 到字符串 deststrcpy(str1, str2);
strcat(dest, src)将字符串 src 追加到字符串 dest 的末尾strcat(str1, str2);
strlen(str)返回字符串 str 的长度int len = strlen(str);
strcmp(str1, str2)比较字符串 str1 和字符串 str2 是否相等int result = strcmp(str1, str2);
strchr(str, ch)在字符串 str 中查找字符 chchar *ptr = strchr(str, 'a');
strstr(str1, str2)在字符串 str1 中查找字符串 str2char *ptr = strstr(str1, str2);
memset(ptr, value, num)ptr 所指向的内存区域的前 num 个字节的值设为 valuememset(str1, 0, sizeof(str1));
free(ptr)释放动态分配的内存free(str);

其中,sizenew_size 表示所需的内存大小,ptr 表示指向动态分配内存的指针,destsrc 表示要操作的字符串,ch 表示要查找的字符,str1str2 表示要查找或比较的字符串。

示例代码:

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



//chat *strcpy(char" dest, const chat tercl:
int main()
{

    char*p;//野指针
    p = (char*)malloc(1);//p有了具体的内存指向

    *p = 'c';

    free(p); //放开
    p = NULL;

    p = (char*)malloc(12);

    printf("扩容地址:%x\n",p);

    int len =strlen("smallsnake1234234i273");

    int newLen = len-12+1;

    realloc(p,newLen);

    printf("扩容后地址:%x\n",p);

    strcpy(p,"smallsnake1234234i273");

    puts(p);
    puts("end");

    return 0;
}

相关API(集合)

API描述例子
printf输出格式化的字符串到标准输出printf("Hello, %s!", name);
fprintf输出格式化的字符串到指定文件流fprintf(file, "Error: %s", message);
scanf从标准输入读取格式化的数据scanf("%d", &num);
fscanf从指定文件流读取格式化的数据fscanf(file, "%d %f", &num, &price);
atoi将字符串转换为整数int num = atoi(str);
atof将字符串转换为浮点数float num = atof(str);
strcpy复制字符串 src 到字符串 deststrcpy(str1, str2);
strncpy复制字符串 src 到字符串 dest,最多 n 个字符strncpy(str1, str2, n);
strcat将字符串 src 追加到字符串 dest 的末尾strcat(str1, str2);
strncat将字符串 src 追加到字符串 dest 的末尾,最多追加 n 个字符strncat(str1, str2, n);
strcmp比较字符串 str1 和字符串 str2 是否相等int result = strcmp(str1, str2);
strncmp比较字符串 str1 和字符串 str2 前 n 个字符是否相等int result = strncmp(str1, str2, n);
strchr在字符串 str 中查找字符 chchar *ptr = strchr(str, ch);
strrchr在字符串 str 中从后往前查找字符 chchar *ptr = strrchr(str, ch);
strstr在字符串 str1 中查找字符串 str2char *ptr = strstr(str1, str2);
strtok分割字符串 str,返回下一个子字符串char *ptr = strtok(str, delim);
sscanf从字符串 str 中读取格式化的数据sscanf(str, "%d %f", &num, &price);
fgets从指定文件流中读取一行fgets(buffer, size, file);
puts输出字符串到标准输出puts(str);
strtok分割字符串,返回下一个子字符串char str[] = "apple,banana,orange";
char *ptr = strtok(str, ",");
while (ptr != NULL) {
printf("%s\n", ptr);
ptr = strtok(NULL, ",");
}
strchr在字符串中查找字符char str[] = "Hello, world!";
char *ptr = strchr(str, 'o');
printf("%s\n", ptr);
strrchr在字符串中从后往前查找字符char str[] = "Hello, world!";
char *ptr = strrchr(str, 'o');
printf("%s\n", ptr);
strstr在字符串中查找子字符串char str[] = "The quick brown fox jumps over the lazy dog";
char *ptr = strstr(str, "brown");
printf("%s\n", ptr);
malloc(size)动态分配内存,创建指定大小的字符串存储空间char *str = (char*)malloc(sizeof(char) * 20);
realloc(ptr, new_size)重新分配内存,增加或减少字符串存储空间str = (char*)realloc(str, sizeof(char) * 30);
strcpy(dest, src)复制字符串 src 到字符串 deststrcpy(str1, str2);
strcat(dest, src)将字符串 src 追加到字符串 dest 的末尾strcat(str1, str2);
strlen(str)返回字符串 str 的长度int len = strlen(str);
strcmp(str1, str2)比较字符串 str1 和字符串 str2 是否相等int result = strcmp(str1, str2);
strchr(str, ch)在字符串 str 中查找字符 chchar *ptr = strchr(str, 'a');
strstr(str1, str2)在字符串 str1 中查找字符串 str2char *ptr = strstr(str1, str2);
memset(ptr, value, num)ptr 所指向的内存区域的前 num 个字节的值设为 valuememset(str1, 0, sizeof(str1));
free(ptr)释放动态分配的内存free(str);

字符串常用操作函数第一部分

注释掉的部分大叫可以打开自己用一下

#include <stdio.h>

#include <string.h>
int main()
{
    char *p = "smallsnake";
    char str[21] = "\0";
    
    puts(p);
    printf("%s\n",p);
    //scanf("%s",str);
	//gets(str);
	strncpy(str,p,strlen(p));
    puts(str);
    return 0;
}

image.png

实现字符串拷贝函数

#include <stdio.h>
#include <string.h>
//方法一
/*char *myStrcpy(char *des,char *src)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    while(*src != '\0'){
        *des = *src;
        des++;
        src++;
    }
    *des = '\0';
}*/
//方法二
/*char *myStrcpy(char *des,char *src)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    while(*src != '\0'){
        *des++ = *src++;
        
    }
    *des = '\0';
}*/
//方法三
char *myStrcpy(char *des,char *src)
{
    if(des == NULL || src == NULL){
        return NULL;
    }
    char *bak = des;
    while((*des++ = *src++) != '\0');
    *des = '\0';
}
int main()
{
    char str[999] = "\0";
    char *p = "smallsnake";
    myStrcpy(str,p);
    puts(str);
    return 0;
}

断言函数(assert)--面试可能被问到

代码

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

char *myStrcpy(char *des,char *src)
{
  assert(des != NULL && src != NULL);
    char *bak = des;
    while(*src != '\0'){
        *des = *src;
        des++;
        src++;
    }
    *des = '\0';
}
int main()
{
    char str[999] = "\0";
    char *p = "smallsnake";
    char *pp = NULL;
    myStrcpy(pp,p);//pp你切换一下str你就会发先没有报错,也可以吧p搞成空的
    puts(str);
    return 0;
}

讲解

assert 是 C 语言中的一个,用于在程序运行时检查某个条件是否为真,如果为假则终止程序运行并打印出错信息。如果条件为真,则 assert 不执行任何操作,程序继续正常运行。 assert 通常用于调试程序,帮助程序员在出错时快速定位问题。

注释:
在编程中,宏(Macro)是一种预处理器指令,用于定义代码中的一个符号或代码片段。当程序中遇到该符号或代码片段时,预处理器会自动将其替换为指定的代码。宏在代码中常用于定义常量、宏函数等。使用宏可以提高代码的可读性和可维护性,并且可以避免代码中出现重复的代码片段。

字符串的拼接(strcat)

代码

#include <stdio.h>
#include <string.h>
//方法一
void mystrcat(char *des, const char *src) {
	
    int len = strlen(des);
    int i;
    for (i = 0; *(src + i) != '\0'; i++) {
        *(des + len + i) = *(src + i);
    }
    *(des + len + i) = '\0';
}
//方法二
void mystrcat2(char *des, const char *src) {
	char *bak = des;
        while(*des != '\0'){
            des++;
        }
    while((*des++ = *src++) != '\0');
    *des = '\0';   
}
int main()
{
    char str[222] = "small";
    char *p = " snake";
    //strcat(str, p);
	mystrcat(str, p);
    puts(str);
	return 0;
}

字符串的比较(strcmp)96节

代码

#include <stdio.h>
#include <string.h>
int main()
{
    char *p1 = "smallsnake";
    char *p2 = "SmallSnake";
    int ret1 = strcmp(p1, p2);
    printf("%d\n",ret1);
	
	char *p3 = "SmallSnake";
	char *p4 = "smallsnake";
    int ret2 = strcmp(p3, p4);
    printf("%d\n",ret2);
	
	char *p5 = "smallsnake";
    char *p6 = "smallsnake";
    int ret3 = strcmp(p5, p6);
    printf("%d\n",ret3);
	
    return 0;
}

image.png

字符串完结,兄弟们C语言快完了,冲啊!!!!