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);
}
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);
}
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 stringchar input_string[] = "https:/10.229.89.210/home/data/1.txt";// Our output token listchar **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 NULLchar *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 futurechar *token = strtok_r(input_string, "/", &context);int num_tokens = 0; // Index to token list. We will append to the listwhile (token != NULL){// Keep getting tokens until we receive NULL from strtok()token_list[num_tokens] = strdup(token); // Copy to token listnum_tokens++;token = strtok_r(NULL, "/", &context); // We pass the context variable to strtok_r}// Print the list of tokensprintf("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 ()
C语言 字符串解析strchr/strrchr/strtok//strtok_r函数使用相关推荐
- C语言字符串、文件操作常用操作函数,
C语言字符串常用操作函数 C语言字符串.文件操作常用操作函数 字符串输出 - puts() 字符串输入 - gets() 字符串比较 - strcmp() 字符串复制 - strcpy() 字符串连接 ...
- c语言atof字母,C语言atof,atoi ,strtok等函数用法
atoi是把字符串转换为int型数据 atof是转换为float型 strtok是分隔字符串的 第一个例子用了sscanf, 没有用strtok#include #include #include # ...
- string和C语言字符串之间的相互转换以及string常用函数
#include <iostream> #include <vector> #include <algorithm> #include <string> ...
- C语言字符串、宏定义及主函数介绍
希望你每天醒来都是阳光的,不会因为别人的几句话.几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事... ---- 网易云热评 一.字符串 1.字符串声明 #include <st ...
- C语言字符串查找基础----strchr()、strrchr()、strpbrk()、strstr()
1.查找一个字符 在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数,原型如下所示: char *strchr(char const *str, int ch); char ...
- C语言字符串截取函数strtok和strtok_r
在看源码的时候需要将一段并排的IPs转化成为一系列的IP,将"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5"转换成为单独的"1 ...
- C语言字符串处理的一些函数strok,strstr, strchr,strsub
字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果. 函数使用说: 1.strtok ...
- c语言 字符串分隔,c语言字符串分割–strtok | 逗号分隔-huangea的博客
c语言字符串分割–strtok | 逗号分隔 代码,原理是使用字符串分隔函数 Strtok()函数详解: 该函数包含在"string.h"头文件中 函数原型: char* strt ...
- 有意思的字符串查找函数strchr,strrchr,strstr,strrstr
通过一段时间对字符串的了解,我发现了许多有意思的字符串函数,下面我们就以常见的字符串查找函数:strchr,strrchr,strstr,strrstr为例来模拟实现这些有意思的字符串查找函数吧! [ ...
最新文章
- ASP.NET图象处理详解
- android查找邮件程序,Android 程序崩溃日志邮件获取
- STM32---SPI通信的总结(库函数操作)
- 【Codeforces 631C 】Report(单调栈,思维模拟)
- Python学习笔记(1):用户输入,终端输入
- 任正非认为自己的成功没有秘诀
- 【NLP】用腻了 CRF,试试 LAN 吧?
- 15分钟破解保险箱!美国小哥200美元自制开锁机器人
- 微信小程序-利用wxParse将html转为wxml
- 架构师修炼系列【业务高可用】
- 一个请求式分页存储管理系统中计算机应用,操作系统概论自考2012年7月真题
- git 命令带用户名密码
- im4java+GraphicsMagick 的问题
- MapReduce案例:手机流量的统计
- java如何进行内存自动释放、垃圾回收?
- 通达信指标公式编写答疑汇总(三)
- 中国无线电发射器市场趋势报告、技术动态创新及市场预测
- php日历排班表,排班表 : 轮班工作者必备的排班神器
- 计算机技术复试面试英语自我介绍,计算机复试英语自我介绍
- 为期两年的研究揭示了Android的大问题
热门文章
- 排序算法----希尔排序
- 一文详解知识图谱关键技术与应用 | 公开课笔记
- springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
- (Modern Family S01E03) Part 1 PhilClaire Phil看球赛 Dylan等Haley Clarie说Phil现在依然和Jay呆在一起很不自在
- 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现
- 英语中what的用法
- apahce2+tomcat6整合 2010-06-28
- 小程序快速生成朋友圈海报分享图
- 4GDTU称重系统无线监测系统
- Java实现计数排序