文档章节

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

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

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
粉丝 28
博文 39
码字总数 29164
作品 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
C语言中的字符串处理

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

晨曦之光
2012/03/09
328
0
python学习笔记五:字符串方法

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

笑看天空
2017/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

soapui的安装使用

https://blog.csdn.net/weiqing723/article/details/78865734

暗中观察
6分钟前
0
0
ACID学习记录

ACID的C即一致性,打比方,多个线程并发执行转账业务:A转给B一块钱,无论成功与否(A+B)的总额是不会变的。事务执行前与执行后数据内在的逻辑始终是成立的。这里就是转账前与转账后两人存款的...

wmzsonic
21分钟前
0
0
手写tomcat+servlet

写程序一定要有思路,思路很重要! 一、我们分两步第一步先实现手写tomcat,第二部写servlet 所用技术: 1、soket通信 IO流 2、http请求与相应 3、解析xml 4、java反射技术 导入所需要的jar...

jason_kiss
44分钟前
1
0
Beetl模板的基础用法 【变量、循环、条件】---《Beetl视频课程》(2)

本期视频做了一个博客的首页列表; 内容简介:springboot 集成 beetlsql;使用for循环,使用if控制语句,使用虚拟属性,定义变量等等 一起学beetl目录:https://my.oschina.net/u/1590490?ta...

Gavin-King
49分钟前
1
0
各种视频监控上墙方案的比较

方案1、一使用 DVR 、NVR 直接显示上墙 不得不说,这种办法是成本最低廉的,但这里有不少限制: 无法实现分散点的集中上墙。譬如连锁经营的酒店,如果我在总部建立一个集中上墙的环境,这个就...

PeakFang-BOK
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部