C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用

这篇具有很好参考价值的文章主要介绍了C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在程序中,解析用户输入的参数(命令行参数)是很常见的操作,本文将讲解C语言中常见的一些解析字符串函数使用方法。

1 strchr

1.1 描述

strchr() 用于查找字符串中的一个字符,并返回该字符在字符串中第一次出现的位置。其原型定义在头文件 <string.h> 中。
char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
strchr() 函数返回的指针指向字符串中的字符,如果要将该指针用作字符串,应该将其传递给其他字符串处理函数,例如 printf() 或 strncpy()。

1.2 声明

char *strchr(const char *str, int c)
str – 要查找的字符串。
c – 要查找的字符。
如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,如果未找到该字符则返回 NULL。

1.3 实例
#include <stdio.h>
#include <string.h>

int main()
{
    const char *str = "https://10.229.89.210/home/data/1.txt";
    const char ch = 'd';
    char *ptr;

    ptr = strchr(str, ch);

    if (ptr != NULL)
    {
        printf("字符 '%c 出现的位置为 %ld。\n",ch,  ptr - str + 1);
        printf("|%c| 之后的字符串是 - |%s|\n", ch, ptr);
    }
    else
    {
        printf("没有找到字符 'd' 。\n");
    }
    return (0);
}

strchr,c语言,c++,开发语言,数据结构

2 strrchr
2.1 描述

char *strrchr(const char *str, int c) 在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。其原型定义在头文件 <string.h> 中。

2.2 声明

char *strrchr(const char *str, int c)
str – C 字符串。
c – 要搜索的字符。以 int 形式传递,但是最终会转换回 char 形式。
返回值
该函数返回 str 中最后一次出现字符 c 的位置。如果未找到该值,则函数返回一个空指针

2.3 实例
#include <stdio.h>
#include <string.h>

int main()
{
    const char *str = "https://10.229.89.210/home/data/1.txt";
    const char ch = '/';
    char *ptr;

    ptr = strrchr(str, ch);

    if (ptr != NULL)
    {
        printf("字符 '%c 出现的位置为 %ld。\n",ch,  ptr - str + 1);
        printf("|%c| 之后的字符串是 - |%s|\n", ch, ptr);
    }
    else
    {
        printf("没有找到字符 'd' 。\n");
    }
    return (0);
}

strchr,c语言,c++,开发语言,数据结构

3 strtok
3.1 描述

char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

3.2 声明

char *strtok(char *str, const char *delim)
str – 要被分解成一组小字符串的字符串。
delim – 包含分隔符的 C 字符串。
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

3.3 实例

3.3.1 实例1

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

int main()
{
    char *str = "https://10.229.89.210/home/data/1.txt";

    char *str1 = malloc(sizeof(char) * (strlen(str) + 1));
    strcpy(str1, str);
    const char ch = '/';
    char *ptr;
    char *ptr1;
    ptr = strtok(str, ":");
    //ptr1 = strtok(str1, ":");

    if (ptr != NULL)
    {
    //   printf("%s\n", str);     // strtok会修改
       printf("%s\n", ptr);
    //   printf("\n%s\n\n", ptr1);
    //   printf("\n|%c| 之后的字符串是 - |%s|\n\n", ch, ptr);
    }
    else
    {
        printf("\n没有找到字符 'd' 。\n");
    }
    return (0);
}
结果:段错误 (核心已转储)

3.3.2 实例2

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

int main()
{
    char *str = "https://10.229.89.210/home/data/1.txt";

    char *str1 = malloc(sizeof(char) * (strlen(str) + 1));
    strcpy(str1, str);
    // char str2[64]; strcpy(str2, str);   ==> 数组也可以,如果不习惯 malloc/free匹对使用
    const char ch = '/';
    char *ptr;
    char *ptr1;
    //ptr = strtok(str, ":");
    ptr1 = strtok(str1, ":");

    if (ptr1 != NULL)
    {
    //   printf("%s\n", str);     // strtok会修改str参数值
    //   printf("%s\n", ptr);
       printf("\n%s\n\n", ptr1);
    //   printf("\n|%c| 之后的字符串是 - |%s|\n\n", ch, ptr);
    }
    else
    {
        printf("\n没有找到字符 'd' 。\n");
    }
	free(str1);
    return (0);
}
结果正确: https
4 strtok_r

4.1 声明
char *strtok_r(char *str, const char *delim, char **saveptr);
函数的返回值是 排在前面的 被分割出的字串,或者为NULL,
str是传入的字符串。需要注意的是 :第一次使用strtok_r之后,要把str置为NULL,
delim指向依据分割的字符串。常见的空格“ ” 逗号“,”等
saveptr保存剩下待分割的字符串。

比如:按空格分割 字符串 “first second third”,

分第一次得字串"first",然后saveptr指向了"second third"

分第2次得字串"second",然后saveptr指向了"third"
分第3次得字串"third",然后saveptr指向了NULL
结束。

#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main()
{
    // Our input string
    char input_string[] = "https:/10.229.89.210/home/data/1.txt";

    // Our output token list
    char **token_list = NULL;
    token_list = (char **)malloc(sizeof(char *) * 64);


    // A pointer, which we will be used as the context variable
    // Initially, we will set it to NULL
    char *context = NULL;

    // To get the value of the context variable, we can pass it's address
    // strtok_r() to automatically populate this context variable, and refer
    // it's context in the future
    char *token = strtok_r(input_string, "/", &context);

    int num_tokens = 0; // Index to token list. We will append to the list

    while (token != NULL)
    {
        // Keep getting tokens until we receive NULL from strtok()
        token_list[num_tokens] = strdup(token); // Copy to token list
        num_tokens++;
        token = strtok_r(NULL, "/", &context); // We pass the context variable to strtok_r
    }

    // Print the list of tokens
    printf("Token List:\n");
    for (int i = 0; i < num_tokens; i++)
    {
        printf("%s\n", token_list[i]);
    }
    free(token_list);
    return 0;
}

参考链接:
1 strtok函数缺陷再探
2 strtok () 和 strtok_r ()文章来源地址https://www.toymoban.com/news/detail-768695.html

到了这里,关于C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析C语言中的字符串和字符串处理函数

    标题:详解C语言中的字符串和字符串处理函数 目录: 1.引言 2.什么是C语言中的字符串 3.字符串的表示方式 4.C语言中的字符串处理函数 5.例子:使用字符串处理函数的示例代码 6.总结 在C语言中,字符串是一种常见的数据类型,用于存储一串字符。本篇博客将详细介绍C语言中

    2024年02月15日
    浏览(52)
  • 掌握字符与字符串:C语言中的神奇函数解析(一)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 我们在学习C语言的过程中,除了使用最多的头文件stdio.h,还会使用其他头文件,利用其中的库函数帮助我们简化代码的过程,比如像math.h,string.h等头文

    2024年03月09日
    浏览(64)
  • 掌握字符与字符串:C语言中的神奇函数解析(二)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 声明:int strncmp(const char *str1, const char *str2, size_t n) str1 -- 要进行比较的第一个字符串。 str2 -- 要进行比较的第二个字符串。 n -- 要比较的最大字符数。 作

    2024年03月09日
    浏览(67)
  • 掌握字符与字符串:C语言中的神奇函数解析(三)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 除了字符函数和字符串函数,string.h中还有一类 内存操作函数 ,如memset(),memcmp()等函数,他们在功能和某些字符串函数很像,但作用范围更广,除了作用

    2024年03月09日
    浏览(44)
  • 深入解析C语言中的字符串输出操作

    在C语言中,字符串输出是常见的操作。本篇博客将详细讨论如何使用printf和puts函数输出字符串,以及字符串中的\\0字符和字符串操作结束标志的作用。 输出结果: hello c3 输出结果: hello c3 输出结果: hello c3 输出结果: hello 输出结果: 本篇博客详细讨论了C语言中字符串输

    2024年02月06日
    浏览(47)
  • OpenHarmony语言基础类库【@ohos.url (URL字符串解析)】

    说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 URLParams接口定义了一些处理URL查询字符串的实用方法。 constructor9+ constructor(init?: string[][] | Recordstring, string | string | URLParams) URLParams的构造函数。 系统能力:   System

    2024年04月28日
    浏览(45)
  • Go 语言内置类型全解析:从布尔到字符串的全维度探究

    关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 本文深入

    2024年02月09日
    浏览(50)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(45)
  • mysql 解析json字符串、数组字符串、json数组字符串

    笔者使用mysql 5.7进行了一次json字符串的解析,因为一直在搞大数据相关的数据库、olap等,太久没有用mysql5.x的版本,一些函数已经不知道支不支持,我的同事建议我使用like、rlike模糊匹配的方式,身为数据人我不太喜欢用这种手段,因为他们比较低效。于是我想这里总结一下

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包