c语言字符处理函数常见使用集合
1.最近看一些开源项目代码时,总会看到 c 语言中一些 "str" 开头的处理字符串的用法,有的之前没用到过,特此记录,随时看到随时添加。
这里不提出源码,只是一些使用说明加例子:
1).unsigned long int strtoul(const char *nptr, char **endptr, int base);(类似还有atoi,atof, strtoi, strtol等)
描述:
strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。
参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。
当base值为0时会根据情况选择用哪种进制:如果第一个字符是'0',就判断第二字符如果是‘x’则用16进制,否则用8进制;第一个字符不是‘0’,则用10进制。
一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
理解:
个人觉得使用这个函数的时候,首先要清楚nptr所指的内容是什么进制表达的数,例如"0xff"首先这是个16进制的数,然后你是想要知道这个16进制的数的无符号长整形对应的值是多少。
类似的还有“1234”, “-1234” 等将其转化为对应的无符号数。用错的方式有多种,但是正确的就一种,就是nprt指向的内容可以得到你想要的合法的base进制表达的值.
测试程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 1024 int
main(int argc, char *argv[])
{
char s1[BUFSIZE];
int base;
while(scanf("%s %d", s1, &base) == )
{
printf("result : %u\n", strtoul(s1, NULL, base));
if (errno)
{
printf("errno %d\n", errno);
}
} return ;
}
操作:输入nptr的内容 和 base值, result:即为转换结果。

八进制的转换规则:
十进制到八进制规则:和十进制转二进制一样,除8取每次的余数,然后余数前后转置
八进制转十进制:和二进制转十进制一样,对应位乘上 8^x次方,然后相加,例:72(8)-> 2*8^0 + 7*8^1 = 16 + 56 = 72;
有符号整数转无符号整数:整数相等;负数,符号位在内取反再加1.
2. char * strchr(const char *s, int c), char * strrchr(const char *s, int c);
描述:strchr找到字符c在字符串s中第一次出现的位置,若找到返回该位置的地址,如没找到返回NULL。
strrchr 找到字符c在字符串s中最后一次出现的位置,若找到返回该位置的地址,如没找到返回NULL。
3.size_t strspn(const char *s, const char *accept), size_t strcspn(const char *s, const char *reject)
描述: strspn, s中从第一个字符开始判断是该字符是否属于accept,若属于则继续往下判断,若不属于返回该字符的在s中的下标,依次类推。s中字符下标从0开始
例子程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 1024 int
main(int argc, char *argv[])
{
char s1[BUFSIZE];
char s2[BUFSIZE];
int base;
while(scanf("%s %s", s1, s2) == )
{
printf("result : %d\n", strspn(s1, s2));
} return ;
}
测试结果:

下面是lsocket中用到该函数的地方:
/* _needsnolookup
*
* helper function: checks if the address consists only of chars that
* make up a valid ip(v4 or v6) address, and thus needs no nslookup.
*
* Arguments:
* addr address to check
*
* Returns:
* 1 if the address consists only of chars that make up a valid ip(v4
* or v6) address, 0 otherwise.
*
* Note: this does not check whether the address is a valid ip address,
* just whether it consists of chars that make up one.
*/
static int _needsnolookup(const char *addr)
{
int len = strlen(addr);
int pfx = strspn(addr, "0123456789.");
if (pfx != len) {
pfx = strspn(addr, "0123456789abcdefABCDEF:");
/* last 2 words may be in dot notation */
if (addr[pfx] == '.') {
int lpfx = strrchr(addr, ':') - addr;
if (lpfx <= || lpfx > pfx) return ;
pfx = lpfx + + strspn(addr + lpfx + , "0123456789.");
}
}
return pfx == len;
}
4. int strcasecmp(const char *s1, const char *s2); int strncasecmp(const char *s1, const char *s2);
描述:比较两个字符串的大小,相同返回i,不同若在第i个字符出不等则返回s1[i] - s2[2]的值,最中要的一点是,s1, s2部分大小写。
理解:和strcmp , strncmp实际上用发相同,只不过是比较的两个字符串部分大小写即 a = a, a = A ...
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h> #define BUFSIZE 1024 int
main(int argc, char *argv[])
{
char s1[BUFSIZE];
char s2[BUFSIZE];
int base;
while(scanf("%s %s", s1, s2) == )
{
printf("result : %d\n", strcasecmp(s1, s2));
} return ;
}
测试结果:

待添加。
Hope this is helpful for you. 欢迎指正错误
c语言字符处理函数常见使用集合的更多相关文章
- C语言字符串匹配函数
C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- go语言笔记——切片函数常见操作,增删改查和搜索、排序
7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 ...
- 总结C语言字符检测函数:isalnum、isalpha...
前言:最近一直在刷leetcode的题,用到isalnum函数,用man手册查找了一下,总共有13个相关函数如下: #include <ctype.h> int isalnum(int c ...
- C语言-字符操作函数
1字符数组的初始化: 1.1 char string={'c','h','i','n','a'} 1.2char string={"china"}或者去掉{}即char strin ...
- C语言字符,字符串,字节操作常用函数
strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...
- Python自动化开发 - 字符编码、文件和集合
本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...
- C语言变量、函数的作用域及变量的存储方式
一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...
- C语言变量和函数命名规范
C 语言变量和函数命名规范: 关于C语言变量和函数命名规范 据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则.命名规则对软件产品而言并不是"成败悠关&quo ...
- 通过实战理解C语言精要——函数篇
前言 本篇博客是对C语言函数部分的重点内容和细枝末节通过实战得到的经验的总结精炼,不涵盖C语言函数的全部内容,所有提炼内容均来自提炼与实战,阅读需要对函数部分有一定基础,可用于对C语言函数的理解提 ...
随机推荐
- jQuery 对象访问 index([selector|element])
搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 .index() 方法传递参数,那么返回值就是这个jQuery对象集合中第一个元素相对于其同辈元素的位置. 如果参数是一组DOM元素或 ...
- fnt 图字原理
摘自:http://blog.csdn.net/wzq9706/article/details/8188256 首先要介绍一下,图字是怎么来的?其实这个很早很早了,记得80后在95年开始玩DOS下的仙 ...
- 修改/etc/hosts 云服务器 没有做外网转内网的优化
[root@a mapReduceLog]# scp /data/visitlog/* root@d:/data/mapReduceVisitorLog/a/root@d's password:vis ...
- form表单学习
1.http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html 2.http://www.cnblogs.com/polk6/arch ...
- sql server内存使用情况
查看Sql Server 数据库的内存使用情况 转自:https://www.cnblogs.com/wanghao4023030/p/8299478.html DBCC MemoryStatu ...
- Java并发—同步容器和并发容器
简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Ha ...
- 知乎Live总结-重复nature文章笔记Single-cell
来自知乎Live-孟浩巍 1.文章重要技术及图讲解 首先在转录组RNA-seq中,有基因表达差异.基因融合.可变剪切.RNA单点突变. 在基因组中,单点变异.结构变异,CNV变异(拷贝数变异) 三类基 ...
- 在SQLPLUS里显示IP、用户名和实例名
在SQLPLUS里显示IP.用户名和实例名 方法一: 编辑$ORACLE_HOME/sqlplus/admin/glogin.sql文件在末尾加入下面的内容即可 define gname = 'SQ ...
- Team Foundation 中的错误和事件消息
Visual Studio Team System Team Foundation 中的错误和事件消息 Team Foundation 通过显示错误消息和事件消息来通知您操作成功以及操作失败.一部分错 ...
- HDU - 6406 Taotao Picks Apples (RMQ+dp+二分)
题意:N个高度为hi的果子,摘果子的个数是从位置1开始从左到右的严格递增子序列的个数.有M次操作,每次操作对初始序列修改位置p的果子高度为q.每次操作后输出修改后能摘到得数目. 分析:将序列分为左.右 ...