• c语言常见字符函数、内存函数(详讲)


    前言:

    其实在c语言当中是没有字符串这一概念的,不像c++里面有string类型用来存放字符串。在c语言中我们只能把字符串放在字符串常量以及字符数组中。

    1.常见字符串函数

    1.1strlen

    size_t strlen ( const char * str );
    

    作用:用来求字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。

    这里我们要注意的是,在定义字符数组的时候,我们需要给‘\0’留出空间,因为编译器会在字符串后面加一个‘\0’。

    1. #include
    2. #include
    3. int main() {
    4. char arr[5] = "asdfg";
    5. printf("%zd\n", strlen(arr));
    6. return 0;
    7. }

    我们可以看到,如果我们没有手动在字符串后面加一个‘\0',并且还没有预留出一个位置用来编译器自动放‘\0'的时候,strlen在计算字符串大小的时候就会出错。

    所以在使用strlen的时候,我们要注意字符串末尾是否有‘\0',要么是自己手动添加,要么是留出位置(空间)给编译器自动添加。

    当然这种不初始化空间大小方式也可以:(编译器会自动给留出空间放’\0')

    1. char arr[] = "asdfg";
    2. printf("%zd\n", strlen(arr));

    还需要注意的是strlen函数的返回值类型,是size_t而不是int.

    size_t和int有什么区别呢?

    size_t是无符号整数,也就意味着没有负数这一概念.

    1.2.strcpy

    char* strcpy(char * destination, const char * source );

    这个是字符串复制函数,将source指向地址的字符覆盖destination指针指向的地址的元素,以source字符串的‘\0'结束。

    要注意的是:

    1.目标字符串的空间一定要足够。

    2.源字符串一定以’\0'结尾。

    3.会将源字符串中的 '\0' 拷贝到目标空间

    1.3.strcat

    char * strcat ( char * destination, const char * source );
    

    字符串追加函数,用来在目标字符串后面接上源字符串

    通俗的来说就是达到“abc"+"def"="abcdef"这一目的。

    注意:

    1.源字符串必须以 '\0' 结束。

    2.目标空间必须有足够的大,能容纳下源字符串的内容。

    3.目标空间必须可修改。

    4.字符串不可以自己给自己追加。

    为什么不可以自己给自己追加呢?

    首先我们要知道,strcat函数追加的原理是在目标字符串的‘\0'处开始追加,直到源字符串的’\0'被追加过去后马上停止。也就意味着,如果是自己追加自己,在开始追加的时候就把目标字符串的‘\0’给覆盖了,由于目标字符串和源字符串是一个东西,所以发现源字符串的’\0‘找不到了。所以就会出错。

    1.4.strcmp

    int strcmp ( const char * str1, const char * str2 )

    字符串比较函数:标准规定, 第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字。

    那如何比较呢?

    其实就是从第一个字符串开始,比较字典序大小,遇到不一样的就停止。

    1. const char* str1 = "abcdef";
    2. const char* str2 = "abc";
    3. const char* str3 = "abcdef";
    4. const char* str4 = "abd";
    5. const char* str5 = "abc";
    6. const char* str6 = "abc";
    7. printf("%d\n", strcmp(str1, str2));
    8. printf("%d\n", strcmp(str3, str4));

    以上都是我们比较常用的一些字符串函数,下面来介绍一些升级版的字符串函数。

    1.5.strncmp

    char * strncpy ( char * destination, const char * source, size_t num );

    我们发现它跟strcmp函数很像,而且同样也是实现字符串的比较功能,但是strncmp可以控制比较的长度,第三个参数表示只比较前num个字符的大小。

    1. const char* str1 = "abcdef";
    2. const char* str2 = "abc";
    3. printf("%d\n", strncmp(str1, str2,3));

    1.6.strncat

    char * strncat ( char * destination, const char * source, size_t num );
    

    跟strcat函数很像,而且同样也是实现字符串的追加功能,但是前者可以控制追加的长度,第三个参数表示只追加源字符串前num个字符。

    1. char arr1[20] = "xxxxxxxxx";
    2. char arr2[5] = "asdff";
    3. printf("%s\n", strncat(arr1, arr2,2));

    1.7.strncpy

    拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

    1.8.strstr

    char * strstr ( const char *str1, const char * str2);

    查找字符串str1里面有没有出现str2所指字符串,如果有返回首次出现的位置。

    1. #include
    2. #include
    3. int main ()
    4. {
    5. char str[] ="This is a simple string";
    6. char * pch;
    7. pch = strstr (str,"simple");
    8. strncpy (pch,"sample",6);
    9. puts (str);
    10. return 0;
    11. }

    1.9.strtok

    char * strtok ( char * str, const char * sep );
    

    这个函数大家见的可能比较少,这是分割函数。

    就是将一个字符串按照一个分割符集合去分割成各个部分。

    1.sep参数是个字符串,定义了用作分隔符的字符集合 。

    2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。

    3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

    4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。

    5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。

    6.如果字符串中不存在更多的标记,则返回 NULL 指针。

    使用strtok将字符串分割:

    1. char str[] ="- This, a sample string.";
    2. char * pch;
    3. printf ("Splitting string \"%s\" into tokens:\n",str);
    4. pch = strtok (str," ,.-");
    5. while (pch != NULL)
    6. {
    7. printf ("%s\n",pch);
    8. pch = strtok (NULL, " ,.-");
    9. }

    1. char *p = "zhangpengwei@bitedu.tech";
    2. const char* sep = ".@";
    3. char arr[30];
    4. char *str = NULL;
    5. strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
    6. for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
    7. {
    8. printf("%s\n", str);
    9. }

    strtok 函数会返回分割后的子字符串的指针,如果没有可分割的字符串,返回 NULL。请注意,在每次调用 strtok 函数时,第一个参数传入 NULL,以便获取剩余的分割字符串。

    2.常见内存函数

    什么叫内存函数?

    内存函数是指在 C 语言中用来操作内存的一组函数。这些函数允许开发者对内存进行分配、拷贝、比较和设置等操作,以满足程序的需求。

    常见的内存函数包括:

    1. malloc:用于动态分配指定大小的内存空间。
    2. calloc:用于动态分配指定数量和大小的内存空间,并将分配的内存初始化为零。
    3. realloc:用于重新调整之前动态分配的内存空间的大小。
    4. free:用于释放之前动态分配的内存空间。
    5. memcpy:用于将源内存区域的内容复制到目标内存区域。
    6. memcmp:用于比较两个内存区域的内容是否相同。
    7. memset:用于将指定内存区域的内容设置为指定的值。
    8. memmove:用于在内存中移动一块数据的内容。

    这里我只讲后面几个。

    2.1.memcpy

    void * memcpy ( void * destination, const void * source, size_t num );
    

    函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。

    不同于strcpy,memcpy可以复制任何类型的数据。

    1. #include
    2. #include
    3. struct {
    4. char name[40];
    5. int age;
    6. } person, person_copy;
    7. int main ()
    8. {
    9. char myname[] = "Pierre de Fermat";
    10. /* using memcpy to copy string: */
    11. memcpy ( person.name, myname, strlen(myname)+1 );
    12. person.age = 46;
    13. /* using memcpy to copy structure: */
    14. memcpy ( &person_copy, &person, sizeof(person) );
    15. printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
    16. return 0;
    17. }

    2.2.memmove

    memmove 是一个 C 语言库函数,用于在内存中移动一块数据的内容。它的函数原型如下:

    void *memmove(void *dest, const void *src, size_t n);

    1.dest 是目标内存区域的指针,数据将被复制到此处。

    2.src 是源内存区域的指针,要复制的数据来自此处。

    3.n 是要复制的字节数。

    memmove 函数将源内存区域中的数据复制到目标内存区域。与 memcpy 不同的是,memmove 函数可处理源和目标内存区域重叠的情况,确保数据被正确复制。

    1. #include
    2. #include
    3. int main() {
    4. char str[10] = "Hello";
    5. // 使用 memmove 将字符 'o' 移动到字符串开头
    6. memmove(str, str+4, 2);
    7. printf("%s\n", str); // 输出结果: "oHell"
    8. return 0;
    9. }

    2.3.memcmp

    内存比较函数,比较从ptr1和ptr2指针开始的num个字节,在num个字节之前遇到不相等的就停下,返回值和strcmp一致。

    1. int memcmp ( const void * ptr1,
    2. const void * ptr2,
    3. size_t num );
    1. char buffer1[] = "DWgaOtP12df0";
    2. char buffer2[] = "DWGAOTP12DF0";
    3. int n;
    4. n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
    5. if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
    6. else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
    7. else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  • 相关阅读:
    【Dbeaver编码格式】Dbeaver升级到23.2.3之后原sql脚本打开中文乱码问题
    怎么裁剪音频?这个方法建议收藏备用
    设计模式-单例模式(最全总结)
    centos7搭建EFK日志收集系统
    143.如何个性化推荐系统设计-3
    Lucene和Solr和Elasticsearch区别,全文检索引擎工具包Lucene索引流程和搜索流程实操
    成为会带团队的技术人 稳定性(三):那些年源源不断的“红包”事故
    正确部署Baichuan2(Ubuntu20.4) 步骤及可能出现的问题
    OCP-042之:Oracle实例管理
    数据结构与算法-----指针与结构体
  • 原文地址:https://blog.csdn.net/qq_62987647/article/details/133276729