【C 标准库】<string.h>

参考链接:C 标准库 - <string.h>

string.h中主要有两类函数:

  memxxx 和 strxxx,其中memxxx是针对内存操作的函数,在遇到‘\0‘的时候并不会停下来,而通常是设置一个size_t类型(其实是unsigned int)的参数来表示字节大小;

  而strxxx是针对字符串操作的函数,遇到‘\0‘停下来。strxxx函数中,有一些函数是strnxxx的,这些函数可以通过传入一个size_t类型的参数来表示字节大小,所以遇到‘\0‘或到达字节大小都会停下来,相对安全。

以下分组介绍函数:

1、memcpy memmove strcpy strncpy

void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
 
// 内存拷贝。当拷贝字符串的时候,考虑到‘\0‘的问题,可以这样拷贝进str1。此时如果str2中有\0,拷贝动作仍然会进行下去,直到达到n次
memcpy(str1, str2, sizeof(str1) - 1);
str1[sizeof(str1) - 1] = ‘\0‘;
// 遇到内存重叠的情况,memmove是更安全的,不会造成覆盖的情况
// http://stackoverflow.com/questions/4415910/memcpy-vs-memmove
char str5[] = "aabbcc";
printf( "The string: %s\n", str5 );
memcpy( str5, str5 + 2, 4 );    // cccccc , wrong
printf( "New string: %s\n", str5 );

strncpy( str5, "aabbcc", sizeof(str5) );   // reset string

printf( "The string: %s\n", str5 );
memmove( str5, str5 + 2, 4 );   // bbcccc , right
printf( "New string: %s\n", str5 );

// 字符串拷贝。同理,strncpy也是如此。不过memcpy不考虑中间遇到‘\0‘的问题,而strncpy遇到\0就停止拷贝
ret = strncpy(str1, str2, sizeof(str1) - 1);
str1[sizeof(str1) - 1] = ‘\0‘;
// 如果str1的空间不足以放下str2,就会造成内存溢出
ret = strcpy(str1, str2);

  

2、memcmp strcmp strncmp

stackoverflow里有个回答举例很详细:what-is-the-difference-between-memcmp-strcmp-and-strncmp-in-c

strcmp 比较的是以‘\0‘ 结束的字符串

strncmp 比较的是至多n个字符、以‘\0‘结束的字符串

memcmp 比较的是n个字节的二进制字节缓冲区

void *memcpy(void *dest, const void *src, size_t n);
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
    const char s1[] = "atoms\0\0\0\0";  // extra null bytes at end
    const char s2[] = "atoms\0abc";     // embedded null byte
    const char s3[] = "atomsaaa";

    if(strcmp(s1, s2) == 0){printf("strcmp(s1, s2) == 0 \n");}      // strcmp stops at null terminator
    if(strcmp(s1, s3) != 0){printf("strcmp(s1, s3) != 0 \n");}      // Strings are different
    if(strncmp(s1, s3, 5) == 0){printf("strncmp(s1, s3, 5) == 0 \n");}  // First 5 characters of strings are the same
    if(memcmp(s1, s3, 5) == 0){printf("memcmp(s1, s3, 5) == 0 \n");}   // First 5 bytes are the same
    if(strncmp(s1, s2, 8) == 0){printf("strncmp(s1, s2, 8) == 0 \n");}  // Strings are the same up through the null terminator
    if(memcmp(s1, s2, 8) != 0){printf("memcmp(s1, s2, 8) != 0 \n");}   // First 8 bytes are different

  

3、memchr strchr strrchr

memchr 在内存中,从某个地址开始到n个字节之后,返回最早匹配到的字符的指针

strchr 在一个字符串中,返回最早匹配到的字符的指针

strrchr 在一个字符串中,返回最后一个匹配到的字符的指针

void *memchr(const void *str, int c, size_t n);
char *strchr(const char *str, int c);
char *strrchr(const char *str, int c);

  

    char chr[] = "there is an orange";
    const char *memchrres = memchr(chr, ‘r‘, 12); // 中间的int型参数其实需要传入char型的字符。。
    const char *strchrres = strchr(chr, ‘r‘);
    const char *strrchrres = strrchr(chr, ‘r‘);
    printf("memchrres:(%p) %s, strchrres:(%p) %s, strrchrres:(%p) %s \n", &memchrres, memchrres, &strchrres, strchrres, &strrchrres, strrchrres);

  

4、memset:将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针(摘自 百度百科)

void *memset(void *str, int c, size_t n);

  

struct S abc;
memset(&abc, 0, sizeof(struct S));

5、strstr:在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。

char *strstr(const char *haystack, const char *needle);

  

    const char haystack[20] = "W3CSchool lalala";
    const char needle[10] = "School";
    char *strres;
    strres = strstr(haystack, needle);
    printf("%s \n", strres);

  

6、strlen strnlen

strlen 计算字符串的长度,直到空结束字符,但不包含空结束字符

strnlen 以上函数不安全,如果字符串非法(不包含‘\0‘),所以需要规定最大匹配长度,防止内存溢出

size_t strlen(const char *str);
size_t strnlen(const char *str, size_t maxlen);

  

    const char strlenres[] = "test strlen";
    printf("strlen = %d \n", (int)strlen(strlenres));
    // 如果string没有\0的时候,会判断出错
    printf("strnlen = %d \n", (int)strnlen(strlenres, sizeof(strlenres)));

  

7、strcat strncat

strcat 把源字符串追加到目标字符串的后面

strncat 规定最大追加数n,相对安全

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

  

    char cat1[20] = "lalala";
    char cat2[] = "short";
    char cat3[] = "longlong";
    printf("res1 = %s \n", strcat(cat1, cat2));
    printf("res2 = %s \n", strncat(cat1, cat2, sizeof(cat1) - 1 - strlen(cat1)));
    printf("res3 = %s \n", strncat(cat1, cat3, sizeof(cat1) - 1 - strlen(cat1)));

  

8、strtok:根据给定的分隔符,分割一个长的字符串(使用方法很怪异。。)

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

  

    char tok[80] = "This is - www.w3cschool.cc - website";
    const char delim[] = "-";
    char *token = strtok(tok, delim);   // 获取第一个字符串
    while(token != NULL){
        printf("%s \n", token);
        token = strtok(NULL, delim);    // 注意!
    }

  

时间: 2024-10-20 10:19:21

【C 标准库】<string.h>的相关文章

C 标准库 - &lt;string.h&gt;

C 标准库 - <string.h> 简介 string .h 头文件定义了一个变量类型.一个宏和各种操作字符数组的函数. 库变量 下面是头文件 string.h 中定义的变量类型: 序号 变量 & 描述 1 size_t 这是无符号整数类型,它是 sizeof 关键字的结果. 库宏 下面是头文件 string.h 中定义的宏: 序号 宏 & 描述 1 NULL这个宏是一个空指针常量的值. 库函数 下面是头文件 string.h 中定义的函数: 序号 函数 & 描述 1

C 标准库 - string.h之strncpy使用

strncpy 把 src 所指向的字符串复制到 dest,最多复制 n 个字符.当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充. char *strncpy(char *destination, const char *source, size_t num) Parameters destination Pointer to the destination array where the content is to be copied. 指向用于存储复制内容的目标数组. s

C 标准库 - string.h之strcat使用

strcat Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatena

C 标准库 - string.h之strspn使用

strspn Returns the length of the initial portion of str1 which consists only of characters that are part of str2. The search does not include the terminating null-characters of either strings, but ends there. 检索字符串 dest 中第一个不在字符串 src 中出现的字符下标.返回 dest

C 标准库 - string.h之strpbrk使用

strpbrk Locate characters in string,Returns a pointer to the first occurrence in str1 of any of the characters that are part of str2, or a null pointer if there are no matches. The search does not include the terminating null-characters of either str

C 标准库 - string.h之strlen使用

strlen Returns the length of the C string str. The length of a C string is determined by the terminating null-character: A C string is as long as the number of characters between the beginning of the string and the terminating null character (without

C 标准库 - string.h之memchr使用

memchr Locate character in block of memory,Searches within the first num bytes of the block of memory pointed by ptr for the first occurrence of ch (interpreted as an unsigned char), and returns a pointer to it. 在参数 ptr 所指向的字符串的前 count 个字节中搜索第一次出现字符

一、Python的标准库String

一.Python的标准库String 1.查看武器 a. help(type()) name = "jane"print(help(type(name))) b. capitalize() name = "jane" print(name.capitalize()) 效果:Jane c. center() name = "jane" print(name.center(50, '-')) 效果:-----------------------jan

【C++ Primer每日刷】之三 标准库 string 类型

标准库 string 类型 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与其他的标准库类型一样,用户程序要使用 string 类型对象,必须包含相关头文件.如果提供了合适的 using 声明,那么编写出来的程序将会变得简短些: #include <string> using std::string; 1.1 string 对象的定义和初始化 string 标准库支持几个

标准库string类型用法(一)

标准库string类型 1. string对象的定义与初始化 string s1;                             默认构造函数,s1为空串 string s2(s1);                      将s2初始化为s1的一个副本 string s3("nwpu");            将s3初始化为一个字符串字面值副本 string s4(n, 'b');                 将s4初始化为字符‘b’的n个副本 2. string对