在程序中,解析用户输入的参数(命令行参数)是很常见的操作,本文将讲解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函数使用相关推荐

  1. C语言字符串、文件操作常用操作函数,

    C语言字符串常用操作函数 C语言字符串.文件操作常用操作函数 字符串输出 - puts() 字符串输入 - gets() 字符串比较 - strcmp() 字符串复制 - strcpy() 字符串连接 ...

  2. c语言atof字母,C语言atof,atoi ,strtok等函数用法

    atoi是把字符串转换为int型数据 atof是转换为float型 strtok是分隔字符串的 第一个例子用了sscanf, 没有用strtok#include #include #include # ...

  3. string和C语言字符串之间的相互转换以及string常用函数

    #include <iostream> #include <vector> #include <algorithm> #include <string> ...

  4. C语言字符串、宏定义及主函数介绍

    希望你每天醒来都是阳光的,不会因为别人的几句话.几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事... ----  网易云热评 一.字符串 1.字符串声明 #include <st ...

  5. C语言字符串查找基础----strchr()、strrchr()、strpbrk()、strstr()

    1.查找一个字符 在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数,原型如下所示: char *strchr(char const *str, int ch); char ...

  6. 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 ...

  7. C语言字符串处理的一些函数strok,strstr, strchr,strsub

    字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果. 函数使用说: 1.strtok ...

  8. c语言 字符串分隔,c语言字符串分割–strtok | 逗号分隔-huangea的博客

    c语言字符串分割–strtok | 逗号分隔 代码,原理是使用字符串分隔函数 Strtok()函数详解: 该函数包含在"string.h"头文件中 函数原型: char* strt ...

  9. 有意思的字符串查找函数strchr,strrchr,strstr,strrstr

    通过一段时间对字符串的了解,我发现了许多有意思的字符串函数,下面我们就以常见的字符串查找函数:strchr,strrchr,strstr,strrstr为例来模拟实现这些有意思的字符串查找函数吧! [ ...

最新文章

  1. ASP.NET图象处理详解
  2. android查找邮件程序,Android 程序崩溃日志邮件获取
  3. STM32---SPI通信的总结(库函数操作)
  4. 【Codeforces 631C 】Report(单调栈,思维模拟)
  5. Python学习笔记(1):用户输入,终端输入
  6. 任正非认为自己的成功没有秘诀
  7. 【NLP】用腻了 CRF,试试 LAN 吧?
  8. 15分钟破解保险箱!美国小哥200美元自制开锁机器人
  9. 微信小程序-利用wxParse将html转为wxml
  10. 架构师修炼系列【业务高可用】
  11. 一个请求式分页存储管理系统中计算机应用,操作系统概论自考2012年7月真题
  12. git 命令带用户名密码
  13. im4java+GraphicsMagick 的问题
  14. MapReduce案例:手机流量的统计
  15. java如何进行内存自动释放、垃圾回收?
  16. 通达信指标公式编写答疑汇总(三)
  17. 中国无线电发射器市场趋势报告、技术动态创新及市场预测
  18. php日历排班表,排班表 : 轮班工作者必备的排班神器
  19. 计算机技术复试面试英语自我介绍,计算机复试英语自我介绍
  20. 为期两年的研究揭示了Android的大问题

热门文章

  1. 排序算法----希尔排序
  2. 一文详解知识图谱关键技术与应用 | 公开课笔记
  3. springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
  4. (Modern Family S01E03) Part 1  PhilClaire  Phil看球赛 Dylan等Haley Clarie说Phil现在依然和Jay呆在一起很不自在
  5. 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现
  6. 英语中what的用法
  7. apahce2+tomcat6整合 2010-06-28
  8. 小程序快速生成朋友圈海报分享图
  9. 4GDTU称重系统无线监测系统
  10. Java实现计数排序