C语言:字符串操作函数(strlen/strcat/strcmp/strchr/strstr/strtok...)

1、头文件

#include <string.h>

2、初始化

void *memset(void *s, int c, size_t n);

功能:
  把s所指的内存开始的n个字节清为c
参数:
  s:需要初始化的首地址
  c:填充的字符
  n:地址的长度
返回:
  s指向的地址


3、计算字符串长度

size_t strlen(const char *s);

功能:
  计算字符串的长度,从第1个字符开始直到结束符’\0’
参数:
  待计算的字符串开始地址
返回:
  得到的字符串长度


4、连接字符串

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

功能:
  连接字符串(dest = dest + src)
参数:
  dest:目标字符串首地址
  src:源字符串首地址
  n:src的长度
返回:
  dest指向的地址


5、比较字符串

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
int strcasecmp(const char *s1, const char *s2);
int strncasecmp(const char *s1, const char *s2, size_t n);

功能:
  比较字符串
  strcmp/strncmp比较到结束符’\0’;
  memcmp不管是否遇到’\0’,一直比较n个;
  strcasecmp/strncasecmp忽略大小写(POSIX标准中定义)
参数:
  s1:字符串1
  s2:字符串2
  n:比较的长度
返回:
  负值/0/正值
  ASCII码’a’比’A’大返回正值


6、从字符串中搜索某个字符

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

功能:
  从字符串中搜索字符
  strchr:从左往右
  strrchr:从右往左
参数:
  s:被查找的字符串
  c:要查找的某个字符
返回:
  字符c第一次出现的位置,若没有则为NULL


7、从字符串中搜索字符串

char *strstr(const char *haystack, const char *needle);
char *strcasestr(const char *haystack, const char *needle);

功能:
  从字符串haystack中搜索needle字符串,strstr与strcasestr使用方法一样,但后者不区分大小写。
  另外,strcasestr函数是非标准的,所以需要在#include <string.h>前面添加宏定义#define _GNU_SOURCE或在编译时加上-D_GNU_SOURCE选项。(参考:https://stackoverflow.com/questions/9935642/how-do-i-use-strcasestr
参数:
  haystack:被查找的字符串
  needle:要查找的字符串
返回:
  返回字符串haystack中第一次出现字符串needle的地址;如果没有检索到则返回NULL


8、分割字符串

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);

功能:
  分割字符串str,第二次直接传NULL,因为它内部是一个静态指针,会记住上次位置,它会按照delim一次分割一部分,会改变str,将剩余的字符串保存在saveptr变量中
参数:
  str:待分割的字符串
  delim:分隔符
  saveptr:保存剩余字符串
返回:
  返回分割得到的字符串地址


9、程序示例

#define _GNU_SOURCE  /* 为兼容strcasestr函数 */
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
	char str1[10];
	memset(str1, 0, 10);
	
	
	char str2[10] = "Hello";
	int len = strlen(str2);
	printf("len = %d\n", len);
	printf("sizeof = %lu\n", sizeof(str2));
	/* output:
		len = 5
		sizeof = 10
	 */
	
	
	char str3[20] = "Hello";
	char str4[10] = "World";
	printf("link1: %s\n", strcat(str3 ,str4));
	printf("link2: %s\n", strncat(str3 ,str4, 3));
	/* output:
		link1: HelloWorld
		link2: HelloWorldWor
	 */
	
	
	char str5[10] = "Hello";
	char str6[10] = "hello";
	if(0 == strncmp(str5, str6, 5))
		printf("str5 == str6\n");
	else
		printf("str5 != str6\n");
	/* output:
		str5 != str6
	 */
	
	
	
	if(0 == strncasecmp(str5, str6, 5))
		printf("str5 == str6\n");
	else
		printf("str5 != str6\n");
	/* output:
		str5 == str6
	 */
	
	
	const char *str7 = "Hello world!";
	printf("strchr: %s\n", strchr(str7, 'o'));
	printf("strrchr: %s\n", strrchr(str7, 'o'));
	/* output:
		strchr: o world!
		strrchr: orld!
	 */
	
	printf("strstr: %s\n", strstr(str7, "ll"));
	printf("strcasestr: %s\n", strcasestr(str7, "LL"));
	/* output:
		strstr: llo world!
		strcasestr: llo world!
	*/
	
	char str8[] = "192.168.1.123";
	char *str9;
	str9 = strtok(str8, ".");
	printf("strtok cut: %s\n", str9);
	printf("strtok src: %s\n", str8);
	while((str9 = strtok(NULL, ".")) != NULL){
		printf("strtok cut: %s\n", str9);
		printf("strtok src: %s\n", str8);
	}
	/* output:
		strtok cut: 192
		strtok src: 192
		strtok cut: 168
		strtok src: 192
		strtok cut: 1
		strtok src: 192
		strtok cut: 123
		strtok src: 192
	 */
	
	
	char str10[] = "192.168.1.123";
	char *str11;
	char *str12;
	str11 = strtok_r(str10, ".", &str12);
	printf("strtok_r cut: %s\n", str11);
	printf("strtok_r save: %s\n", str12);
	printf("strtok_r src: %s\n", str10);
	while((str11 = strtok_r(NULL, ".", &str12)) != NULL){
		printf("strtok_r cut: %s\n", str11);
		printf("strtok_r save: %s\n", str12);
		printf("strtok_r src: %s\n", str10);
	}
	/* output:
		strtok_r cut: 192
		strtok_r save: 168.1.123
		strtok_r src: 192
		strtok_r cut: 168
		strtok_r save: 1.123
		strtok_r src: 192
		strtok_r cut: 1
		strtok_r save: 123
		strtok_r src: 192
		strtok_r cut: 123
		strtok_r save: (null)
		strtok_r src: 192
	*/
	
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-QWERT

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值