字符串处理函数
目录
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修订版(黑马程序员)