Loading

字符串处理函数


返回 我的技术栈(Technology Stack)



strcpy()

#include <string.h>
char *strcpy(char *dest, const char *src);
功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去
参数:
	dest:目的字符串首地址
	src:源字符首地址
返回值:
	成功:返回dest字符串的首地址
	失败:NULL

注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
使用测试如下:

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

void my_strcpy(char* dest,const char* src)
{
	while (*dest++ = *src++);  // 【注意:*src++ 是先执行 *src 进行取值,然后再执行 src++操作!】
}

int main(void)
{
	char ch[] = "hello world";
	char str[100] = {0};   //这个空间必定要比原始字符串大

	strcpy(str, ch);  //string.h 中实现的函数
	printf("%s\n", str);

	my_strcpy(str, ch);   //自己函数实现
	printf("%s\n", str);

	return 0;
}

strncpy()

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);
功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。
参数:
	dest:目的字符串首地址
	src:源字符首地址
	n:指定需要拷贝字符串个数
返回值:
	成功:返回dest字符串的首地址
	失败:NULL

使用测试如下:

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


void my_strncpy(char* dest,const char* src,size_t n)
{
	while ((*dest++ = *src++)&& --n);  //之所以是 --n  可以理解为从零开始需要先减去1个
}

int main(void)
{
	char ch[] = "hello world";
	char str[100] = {0};   //这个空间必定要比原始字符串大

	strncpy(str, ch);  //string.h 中实现的函数
	printf("%s\n", str);

	my_strncpy(str, ch,4);    //自己函数实现
	printf("%s\n", str);

	return 0;
}

strcat()

#include <string.h>
char *strcat(char *dest, const char *src);
功能:将src字符串连接到dest的尾部,‘\0’也会追加过去
参数:
	dest:目的字符串首地址
	src:源字符首地址
返回值:
	成功:返回dest字符串的首地址
	失败:NULL

使用测试如下:

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


void my_strcat(char* dest, const char* src)
{
	while (*dest)dest++;
	while (*dest++ = *src++);
}

int main(void)
{
	char dest[100] = "hello";    //这个空间必定要大于两个字符串相加
	char src[] = "world";


	strcat(dest, src);  //string.h 中实现的函数
	printf("%s\n", dest);

	my_strcat(dest, src);    //自己函数实现
	printf("%s\n", dest);

	return 0;
}

strncat()

#include <string.h>
char *strncat(char *dest, const char *src, size_t n);
功能:将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去
参数:
	dest:目的字符串首地址
	src:源字符首地址
	n:指定需要追加字符串个数
返回值:
	成功:返回dest字符串的首地址
	失败:NULL

使用测试如下:

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

void my_strncat(char* dest, const char* src, size_t n)
{
	while (*dest)dest++;
	while ((*dest++ = *src++) && --n);
}

int main(void)
{
	char dest[100] = "hello";    //这个空间必定要大于两个字符串相加
	char src[] = "world";

	strncat(dest, src,3);  //string.h 中实现的函数
	printf("%s\n", dest);

	my_strncat(dest, src,3);    //自己函数实现
	printf("%s\n", dest);

	return 0;
}

strcmp()

#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较 s1 和 s2 的大小,比较的是字符ASCII码大小。
参数:
	s1:字符串1首地址
	s2:字符串2首地址
返回值:
	相等:0
	大于:>0 在不同操作系统strcmp结果会不同   返回ASCII差值
	小于:<0

使用测试如下:

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

int my_strcmp(const char* s1, const char* s2)
{
	while (*s1 == *s2)
	{
		if (*s1 == '\0')
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 > *s2 ? 1 : -1;
}

int main(void)
{
	char ch1[] = "hello wolrd";
	char ch2[] = "hallo world";

	int value = strcmp(ch1,ch2);  //string.h 中实现的函数
	printf("%d\n", value);

	int value = my_strcmp(ch1, ch2);    //自己函数实现
	printf("%s\n", value);

	return 0;
}

strncmp()

#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
功能:比较 s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。
参数:
	s1:字符串1首地址
	s2:字符串2首地址
	n:指定比较字符串的数量
返回值:
	相等:0
	大于: > 0
	小于: < 0

使用测试如下:

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

int my_strncmp(const char* s1, const char* s2,size_t n)
{
	for (int i = 0; i < n && s1[i] && s2[i]; i++) 
	{
		if (s1[i] != s2[i])
		{
			return s1[i] > s2[i] ? 1 : -1;
		}
	}
}

int main(void)
{
	char ch1[] = "hello wolrd";    
	char ch2[] = "hallo world";

	int value = strncmp(ch1,ch2,3);  //string.h 中实现的函数
	printf("%d\n", value);

	int value = my_strncmp(ch1, ch2,3);    //自己函数实现
	printf("%s\n", value);

	return 0;
}

sprintf_s()

#include <stdio.h>
int sprintf_s(char *str, const char *format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0'  为止。
参数:
	str:字符串首地址
	format:字符串格式,用法和printf()一样
返回值:
	成功:实际格式化的字符个数
	失败: - 1

使用测试如下:

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

int main(void)
{
	char ch[100];

	sprintf_s(ch, "hello world"); 
	printf("%s\n", ch); //输出:hello world

	sprintf_s(ch, "%d+%d=%d",1,2,3);
	printf("%s\n", ch); //输出:1+2=3
	
	sprintf_s(ch, "%02d+%02d=%02d", 1, 2, 3);
	printf("%s\n", ch); //输出:01+02=03

	return 0;
}

sscanf_s()

#include <stdio.h>
int sscanf_s(const char *str, const char *format, ...);
功能:从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。
参数:
	str:指定的字符串首地址
	format:字符串格式,用法和scanf()一样
返回值:
	成功:参数数目,成功转换的值的个数
	失败: - 1

使用测试如下:

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

int main(void)
{
	char ch[] = "1+2=3";

	int a, b, c;
	sscanf_s( ch,"%d+%d=%d",&a,&b,&c); //输出:01+02=03

	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);

	return 0;
}

strstr()

#include <string.h>
char *strchr(const char *s, int c);
功能:在字符串s中查找字母c出现的位置
参数:
	s:字符串首地址
	c:匹配字母(字符)
返回值:
	成功:返回第一次出现的c地址
	失败:NULL

使用测试如下:

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

char* my_strchr(char* s, int c) 
{
	while (*s) 
	{
		if (*s == c)
		{
			return s;
		}
		s++;
	}
	return NULL;
}

int main(void)
{
	char ch[] = "hello world";

	char c = 'l';
	char* p = strchr(ch, c);
	//char* p = my_strchr(ch, c);

	printf("%s\n", p);

	return 0;
}

strstr()

#include <string.h>
char *strstr(const char *haystack, const char *needle);
功能:在字符串haystack中查找字符串needle出现的位置
参数:
	haystack:源字符串首地址
	needle:匹配字符串首地址
返回值:
	成功:返回第一次出现的needle地址
	失败:NULL

使用测试如下:

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

int main(void)
{
	char ch[] = "hello world";
	char str[] = "llo";

	char* p = strstr(ch, str);

	printf("%s\n", p);

	return 0;
}

strtok()

#include <string.h>
char *strtok(char *str, const char *delim);
功能:来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
参数:
	str:指向欲分割的字符串
	delim:为分割字符串中包含的所有字符
返回值:
	成功:分割后字符串首地址
	失败:NULL

在第一次调用时:strtok()必需给予参数s字符串
往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
使用测试如下:

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

int main(void)
{
	//字符串截取  strtok会破坏原字符串  用 \0 替换分隔的标志 位
	char str[] = "www.baidu.com"; // www\0baidu.com

	char* p[3];
	char* buf;
	p[0] = strtok_s(str, ",", &buf);
	int i = 0;
	while (p[i])
	{
		i++;
		p[i] = strtok_s(NULL, ",", &buf);
	}

	return 0;
}

atoi()

#include <stdlib.h>
int atoi(const char *nptr);
功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。
参数:
	nptr:待转换的字符串
返回值:成功转换后整数

类似的函数有:

  • atof():把一个小数形式的字符串转化为一个浮点数。
  • atol():将一个字符串转化为long类型

参考:
[1]C基础讲义2018修订版(黑马程序员)


posted @ 2021-07-24 17:06  言非  阅读(122)  评论(0编辑  收藏  举报