美文网首页
【tip】C语言常用字符串处理接口汇总

【tip】C语言常用字符串处理接口汇总

作者: papi_k的小茅屋 | 来源:发表于2024-01-16 15:53 被阅读0次
    一、字符串转整数

    1.atoi -- 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)
    声明:int atoi(const char *str)
    如:

    int val;
    char str[20];
    strcpy(str, "98993489");
    val = atoi(str);
    

    2.sscanf -- 从字符串格式化读取数据
    声明:int sscanf(const char *buffer, const char *format [, argument ] ...);
    参数说明:
    buffer – 待格式化的字符串;
    format – 根据参数format字符串来转换并格式化数据。
    如:

    int res;
    sscanf(str, "%d", &res);
    

    又如:

    const char* buffer = "192.168.0.1/13/hello world";
    int ip[4];
    char ch;
    char str[32];
    // 读取IP地址,char型字符,字符串
    sscanf(buffer, "%d.%d.%d.%d/%c%s", &ip[0], &ip[1], &ip[2], &ip[3], &ch, str);
    printf("ip = %d.%d.%d.%d, c = %c, str = %s\n", ip[0], ip[1], ip[2], ip[3], ch, str);
    // 输出结果为:ip = 192.168.0.1, c = 1, str = 3/hello
    
    // 解释:
    // 当字符串为某种格式时,可以快速进行字符类型转换,如ip地址字符串"192.168.0.1",可以使用“%d.%d.%d.%d”进行快速获取;
    // %s,会读取连续字符,直到遇到一个分隔符(分隔符可以是空白、换行和制表符)结束。"hello"和"world"之间有空格,所以上面执行后读入"3/hello"后截止。
    // 注意,如"abc.html|success",使用"%s|%s"无法分开格式化读入数据
    

    3.strtol -- 字符串转换成long型。
    根据最新规范,避免使用atoi、atol函数。
    声明:long int strtol(const char *str, char **endptr, int base)
    如:

    char *s = "1235456";
    char *tmp;
    printf("num-%ld\n", strtol(s, &tmp, 10));
    

    4.strtoll // 字符串转换成long long型。
    根据最新规范,避免使用atoll函数。
    声明:longd long int strtoll(const char *str, char **endptr, int base)

    二、整数转字符串

    1.sprintf -- 发送格式化输出到 str 所指向的字符串
    声明:int sprintf(char *str, const char *format, ...)
    如:

    int num = 123456;
    char str[80] = {0};
    sprintf(str, "%d", num); 
    sprintf(str, "%f", num); // 如果num是浮点数,如
    sprintf(str, "Pi 的值 = %f", M_PI); //Pi 的值 = 3.141593
    sprintf(str,"%s","HelloWorld\n"); //"HelloWorld\n"写入a指向的地址
    
    三、memset

    声明:void *memset(void * dest, int ch, size_t count)
    作用:将ch值(在转换为无符号字符后,就像通过(unsigned char)ch)复制到dest指向的对象的前count个字符。
    memset一般用来给申请的数组空间清零使用。
    对于int类型的数组只能将其初始化为0 或 -1;
    对于char类型的数组可以将其初始化为任意一个单字符。

    对应的安全函数是:
    errno_t memset_s(void * dest, rsize_t destsz, int ch, rsize_t count)

    四、memcpy

    声明:void *memcpy(void *str1, const void *str2, size_t n)
    作用:从存储区 str2 复制 n 个字节到存储区 str1,内存拷贝。
    如:

    const char src[50] = "http://www.runoob.com";
    char dest[50];
    memcpy(dest, src, strlen(src) + 1);
    

    对应的安全函数是:
    errno_t memcpy_s(void *restrict dest, rsize_t destsz, const void *restrict src, rsize_t count);
    // dest 是目标地址,destsz是目标地址的字符个数(可使用sizeof获取),src是源地址,count是需要拷贝的源字符个数(可使用sizeof获取)

    五、strcat

    声明:char *strcat(char *dest, const char *src) // 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾
    作用:字符串连接
    对应的安全函数是:
    errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc);

    六、strtok

    声明:char *strtok(char *str, const char *delim)
    作用:字符串分割,分解字符串 str 为一组字符串,delim 为分隔符,该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
    注意,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的str已经不一样了。
    如:

    char str[80] = "This is - www.runoob.com - website";
    const char delim[2] = "-";
    char *token = NULL;
    /* 获取第一个子字符串 */
    token = strtok(str, delim);
    /* 继续获取其他的子字符串 */
    while(token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }
    

    对应的安全函数是:
    char *strtok_s(char *str, const char *delim, char **context);
    参数说明:
    str-待分割的字符串;
    delim-分割符字符串;
    context-存储剩余的字符串。
    注意:由于strtok_s函数会对str参数的字符串进行修改,所以str入参不能为[const char * ],否则会导致程序崩溃。
    如:

    char str[] = "hello world,my name is congcong.";
    char *delim = ",";
    char *token = NULL;
    char *nextToken = NULL;
    token = strtok_s(str, delim, &nextToken); // 相当于“,”是分割符delim
    while(token != NULL) {
        printf("%s\n", token);
        token = strtok_s(NULL, delim, &nextToken);
    }
    
    七、strstr

    声明:char *strstr(const char *haystack, const char *needle)
    作用:找到字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。如果未找到则返回 null。
    如:

    const char haystack[20] = "RUNOOB";
    const char needle[10] = "NOOB";
    char *ret;
    ret = strstr(haystack, needle); // ret的结果为: NOOB
    
    八、strchr

    声明:char *strchr(const char *str, int c)
    作用:在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
    如:

    const char str[] = "http://www.runoob.com";
    const char ch = '.';
    char *ret;
    ret = strchr(str, ch);
    printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
    // 输出是: |.| 之后的字符串是 - |.runoob.com|
    
    九、strrchr

    声明:char *strrchr(const char *str, int c)
    作用:在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
    如:

    int len;
    const char str[] = "https://www.runoob.com";
    const char ch = '.';
    char *ret;
    ret = strrchr(str, ch);
    printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
    // 输出是: |.| 之后的字符串是 - |.com|
    
    十、strcpy

    声明:char *strcpy(char *dest, const char *src)
    作用:把 src 所指向的字符串复制到 dest,拷贝字符串,末尾会自动补'\0'。
    对应的安全函数是:
    errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc);

    十一、strncpy

    声明:char *strncpy(char *dest, const char *src, size_t n);
    作用:把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
    如:

    char src[40];
    char dest[12];
    memset(dest, '\0', sizeof(dest));
    strcpy(src, "This is runoob.com");
    strncpy(dest, src, 10);
    对应的安全函数是:
    errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
    
    十二、strcmp

    声明:strcmp(const char *s1,const char * s2)
    作用:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
    // 如果返回值小于 0,则表示 str1 小于 str2。
    // 如果返回值大于 0,则表示 str1 大于 str2。
    // 如果返回值等于 0,则表示 str1 等于 str2。
    //特别注意:strcmp(const char *s1,const char * s2) 这里面只能比较字符串,即可用于比较两个字符串常量,或比较字符数组,不能比较数字等其他形式的参数。

    十三、strncmp

    声明:int strncmp(const char *str1, const char *str2, size_t n)
    作用:把 str1 和 str2 进行比较,最多比较前 n 个字节
    // 如果返回值 < 0,则表示 str1 小于 str2。
    // 如果返回值 > 0,则表示 str1 大于 str2。
    // 如果返回值 = 0,则表示 str1 等于 str2。

    十四、memcmp

    声明:int memcmp(const void *str1, const void *str2, size_t n)
    作用:把存储区 str1 和存储区 str2 的前 n 个字节进行比较, str1 str2-- 指向内存块的指针,n -- 要被比较的字节数。
    // 如果返回值小于0,则表示 str1 小于 str2。
    // 如果返回值大于0,则表示 str1 大于 str2。
    // 如果返回值等于0,则表示 str1 等于 str2。
    // 注意:这个接口不光可以用来判断两个字符串,还可以判断两个整数的数组的内容是否相等,而不必使用for循环逐个遍历了。力扣567题(字符串的排列)可以考虑使用这个接口解题。

    十五、memchr

    声明:void *memchr(const void *str, int c, size_t n)
    作用:在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
    参数说明:
    str -- 指向要执行搜索的内存块。
    c -- 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
    n -- 要被分析的字节数。
    如:

    const char str[] = "http://www.runoob.com";
    const char ch = '.';
    char *ret;
    ret = (char*)memchr(str, ch, strlen(str));
    printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
    // 输出:|.| 之后的字符串是 - |.runoob.com|
    

    yo peace!

    相关文章

      网友评论

          本文标题:【tip】C语言常用字符串处理接口汇总

          本文链接:https://www.haomeiwen.com/subject/scpkodtx.html