文档章节

C语言常用字符串操作函数

jockchou
 jockchou
发布于 2015/06/10 19:18
字数 1356
阅读 11
收藏 1
点赞 0
评论 0

C语言常用字符串操作函数


#include <string.h>

size_t strlen(const char *s);
size_t strnlen(const char *s, size_t maxlen);

char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);

char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

char *strstr(const char *haystack, const char *needle);
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);

前面5组函数都有一个共同特点,第二个函数名比前一个多了个n。先不管这个n的具体含义,我们直接开始讲解函数。

strlen()函数

见名知意,这个函数是用来获取字符串长度的,准确来讲是除去结尾空字符的长度。下面来看一个例子:

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

//截短字符串
void fit(char *str, size_t n);

int main(void)
{
	char msg[] = "Hold on to your hats, hackers. ";
	puts(msg);
	
	fit(msg, 7);
	puts(msg);
	
	puts("Let's look at some more of the string. ");
	
	puts(msg + 8);
	
	return 0;
}

void fit(char *str, size_t n)
{
	if (strlen(str) > n)
		*(str + n) = '\0';
}

声明一个fit()函数用来截短一个字符串到指定长度,参数str没有使用const修饰,即表示字符串可以被fit()函数改变。第二个参数n表示截取后,字符串的长度。在主函数中声明了一个msg字符数组。调用fit(msg, 7),其作用就是*(msg+7) = '\0',也就是把msg字符数组第8个元素变成空字符'\0',让它所表示的字符串提前结束,忽略后面的元素,然而,数组的后面的其他元素仍然存在,puts(msg+8)输出了被截的内容。

strnlen()函数

strnlen()等同strlen()函数,但是返回的值不会超过maxlen。也就是说strnlen()函数中会计算前maxlen个字符,不会超过s+maxlen这个位置。下面我们自己来实现这个函数试试看:

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

size_t strnlen(const char *s, size_t maxlen);

int main(void)
{
	char msg[] = "Hold on to your hats, hackers. ";
	size_t n = strlen(msg);
	size_t m = strnlen(msg, 30);
	
	printf("strlen is %u\n", n);
	printf("strnlen is %u\n", m);
}

size_t strnlen(const char *s, size_t maxlen)
{
	size_t n = 0;
	
	while(*s && n < maxlen) {
		s++;
		n++;
	}
	return n;
}

输出结果:

strlen is 31
strnlen is 30

注释掉我们自己定义的strnlen()函数,使用string.h的定义,再编译执行,结果仍然一样。

strcat()函数

这个函数用来拼接字符串,它将复制第二个字符串的拷贝添加到第一个字符串的结尾,第二个字符串没有改变,第一个字符串成为一个新的组合字符串了。所以第二个参数用const修饰了。函数返回第一个参数的值。那么问题就来了,如果第一个字符串的存储空间不够大,字符串就会溢出,产生不安全的行为。strncat()与之不同,它把src所指字符串的前n个字符添加到dest结尾处,覆盖dest结尾处的'/0',实现字符串连接。所以使用strcat,要程序员自己保证dest足够容纳拼接后的整个字符串,而strncat使用n参数来限制只复制dest空闲的容量大小的字符。strncat()的一个简单实现也许是这样:

char *strncat(char *dest, const char *src, size_t n)
{
	size_t dest_len = strlen(dest);
	size_t i;
	for (i = 0 ; i < n && src[i] != '\0' ; i++)
		dest[dest_len + i] = src[i];
	
	dest[dest_len + i] = '\0';
	
	return dest;
}

strcmp()函数

这个函数用来比较2个字符串s1,s2的大小,如果s1和s2相同,返回为0,s1小于s2,返回负数,否则返回大于0。对于返回数值的大于,不同实现可能不同。有的是-1, 0, 1这三个值,也有的可能是字符串某个位置上的ASCII值的差。而strncmp()的n参数用来限定,只比较s1的前n个字符,而不是一直比较找到不同的字符。因些strncpm(s1, s2, strlen(s2)) == 0这个表达式可以用来判断s1是否以s2开头。当然也可以使用strstr()的返回值来判断。下面的例子程序展示了strncmp()函数的一个用途:

#include<stdio.h>
#include<string.h>
#define LIST_SIZE 5

int main(void)
{
	char *list[LIST_SIZE] = {"astronomy", "astoudfing", "astrophysici", "ostracize", "asterism"};
	const char *str = "astro";
	
	int i, count = 0;
	
	for (i = 0; i < LIST_SIZE; i++) {
		if (strncmp(list[i], str, strlen(str)) == 0) {
			printf("Found: %s\n", list[i]);
			count++;
		}
	}
	
	printf("The list contained %d words beginning with astro.\n", count);
	
	return 0;
}

strcpy()函数

如果要复制一个字符串,即在内存中产生某个字符串的副本,你需要使用strcpy()函数来实现。它的思路有点像strcat()函数,只不过不是拼按在dest的后面,而是直接从dest指针处开始覆盖,同时也会把src结尾的空字符复制。同样要求dest有足够的空间。strncpy()用来限制只复制src前n个字符,如果前n个字符没有空字符,dest字符串将没有结尾的空字符。如果src长度不够n,strncpy()会写入额外的空字符到dest中,确保n个字符被定入。strncpy()的一个简单实现如下:

char *strncpy(char *dest, const char *src, size_t n)
{
	size_t i;

	for (i = 0; i < n && src[i] != '\0'; i++)
		dest[i] = src[i];
	for ( ; i < n; i++)
		dest[i] = '\0';
		
	return dest;
}

strstr()函数

strstr()函数在haystack搜索子串needle,字符串的结尾空字符不会参与比较。返回子串needle第一次匹配时的开始位置的指针。

© 著作权归作者所有

共有 人打赏支持
jockchou
粉丝 29
博文 38
码字总数 28900
作品 1
深圳
高级程序员
Linux Shell 编程笔记

常用命令 比较运算符 数值及字符串比较 判断文件属性 判断文件权限 文件间判断 字符处理命令 正则表达式 基本格式 正则表达式封装类 转义字符控制 控制序列指示器(Control Sequence Indicat...

海涛
2016/03/21
122
0
使用underscore的template自定义模板

underscore的template()是一个十分重要的函数,该函数可以解析3种模板标签,分别如下: template() 函数模板标签 模板标签 功能 <% %> 标签中包含的通常是Javascript代码,在页面渲染数据时执...

卞龙亭
2016/08/10
32
0
C语言编程基础学习中字符串处理函数

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
03/19
0
0
python学习笔记五:字符串方法

常用字符串常量: string.digits:包含数字0~9的字符串 string.letters:包含所有字母(大写或小写字符串,在python3.0中,使用string.ascii-letters代替) string.lowercase:包含所有小写字...

笑看天空
2017/04/19
0
0
C语言中的字符串处理

•字符串字面量(字符串常量,在C标准中称为,字符串字面量) 如何存储字符串字面量 从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时...

晨曦之光
2012/03/09
328
0
MySQL必知必会(6):常用文本字符串处理函数

编程语言中经常使用函数来处理一些字符串,数字或者其他内容。也是一样,可以使用函数来快速达到一系列的目的。 在上一篇文章《计算字段的使用》中,我们提前使用了一个函数,来处理字符串两...

星空幻颖
2017/05/06
0
0
【18-03-23】Matlab 基础概念

1° 计算的介绍 数值默认为双精度实数,可用浮点数或科学计数法表示。浮点数表示范围在 10^-308 ~ 10^308 1.1 关系运算 主要对两个运算量大小关系进行比较,输出逻辑值 1 或 0 1.2 逻辑运算 ...

千阳Weston
03/23
0
0
Python基础:数据类型-字符串:string

一、字符串:string 定义: 1、单引:'' 2、双引:"" 可以包含单引 多行字符串,所见即所得模式,用三个引号。 3、三个单引:''' ''' 4、三个双引:""" """ 可以包含单引号 str="""我是所见即所...

yishijing
2017/11/07
0
0
如何在Xshell中进行快速命令集设置

想必大家都知道,如果把常用字符串指定为快速命令,可点击使用快速命令以替代反复的键盘输入操作。如要显示快速命令栏勾选[查看]菜单的[快速命令]即可。下面就一起来学习如何设置xshell的快速...

软件贴士
02/09
0
0
MySQL常用函数系列之一:字符串函数(1)

本文将演示以下4个常用字符串函数: CANCAT(S1,S2,…Sn) 连接S1,S2,…Sn为一个字符串 INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr LOWER(str) 将字符...

博为峰教研组
2016/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
9分钟前
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
26分钟前
20
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
32分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
57分钟前
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
4
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部