C语言之常见字符串处理函数
1.测试长度函数
头文件:#include<string.h>
函数原型:size_t strlen(const char *s);//不能指针修改内容
函数功能:测s指向的字符串长度,不包括'\0'
返回值:字符串中字符的个数
例子:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20]="hello";
char *str2="hello";
printf("%d\n",sizeof(str1));//20
printf("%d\n",sizeof(str2));//8
printf("%d\n",strlen(str1));//5
printf("%d\n",strlen(str2));//5
return 0;
}
2.字符串拷贝函数
头文件:#include<string.h>
函数原型:char * strcpy(char *dest,const char *src);
函数功能:拷贝src指向的字符串到dest指针指向的内存中,'\0'也会拷贝
返回值:目的内存的地址
注意:在使用此函数的时候,必须保证dest指向的内存空间足够大,否则会造成内存污染
头文件:#include<string.h>
函数原型:char * strncpy(char *dest,const char *src,size_t n);
函数功能:拷贝src指向的字符串的前n个字节到dest指针指向的内存中,'\0'不会拷贝
返回值:目的内存的地址
注意:
1.strncpy不拷贝'\0'
2.如果说n大于src指向的字符串的字符个数,则在dest后面填充n-strlen(src)个'\0'
例子
#include<stdio.h>
#include<string.h>
int main(void){
char str1[10] = "Hello";
char str2[10] = "Hello";
strcpy(str1, "haha"); // 会拷贝/0
printf("%s\n", str1);
strncpy(str2, "haha", 2); // 不会好拷贝/0
printf("%s\n", str2);
return 0;
}
PS E:\code\c_code> cd "e:\code\c_code\" ; if ($?) { gcc test.c -o test } ; if ($?) { .\test }
haha
hallo
3.字符串追加函数
头文件:#include<string.h>
函数原型:char * strcat(char *dest,const char *src);
函数功能:strcat函数追加src的字符串到dest指向的字符串后面,追加的时候追加'\0'
返回值:目的内存的地址
注意:要保证dest指向的空间足够大
头文件:#include<string.h>
函数原型:char * strncat(char *dest,const char *src,size_t n);
函数功能:strcat函数追加src的字符串前n个字符到dest指向的字符串后面,追加的时候会追加'\0'
返回值:目的内存的地址
注意:要保证dest指向的空间足够大
例子
#include<stdio.h>
#include<string.h>
int main(void){
char dest1[100]="Hello";
char dest2[100]="Hello";
char *src = "World";
strcat(dest1,src); // dest1 = "HelloWorld"
strncat(dest2,src,3); // dest2 = "HelloWor"
printf("dest1: %s\n",dest1);
printf("dest2: %s\n",dest2);
return 0;
}
4.字符串比较函数
头文件:#include<string.h>
函数原型:int strcmp(const char *s1,const char *s2);
函数功能:比较s1与s2指向字符串的大小
比较方法:逐个比较字符的ascii码,一旦比出大小函数立即返回,如果字符串一样,返回0
返回值:如果s1指向字符串大于s2指向的字符串返回1
如果s1指向字符串小于s2指向的字符串返回-1
如果相等,返回0
头文件:#include<string.h>
函数原型:int strncmp(const char *s1,const char *s2,size_t n);
函数功能:比较s1与s2指向字符串的的前n个字符
比较方法:逐个比较字符的ascii码,一旦比出大小函数立即返回,如果字符串一样,返回0
返回值:如果s1指向字符串大于s2指向的字符串返回1
如果s1指向字符串小于s2指向的字符串返回-1
如果相等,返回0
例子
#include<stdio.h>
#include<string.h>
int main(void){
char dest1[100]="Helao";
char dest2[100]="Helbo";
int ret_strcmp = strcmp(dest1, dest2);
int ret_strncmp= strncmp(dest1, dest2, 3);
printf("ret_strcmp=%d\n", ret_strcmp);
printf("ret_strncmp=%d\n", ret_strncmp);
return 0;
}
PS E:\code\c_code> cd "e:\code\c_code\" ; if ($?) { gcc test2.c -o test2 } ; if ($?) { .\test2 }
ret_strcmp=-1
ret_strncmp=0
5.字符串匹配函数
头文件:#include<string.h>
函数原型:char * strstr(const char *s1,const char *s2);
函数功能:在s1指向的字符串中找s2指向的字符串,首次匹配
返回值:找到了就返回找到字符串的首地址
找不到返回NULL
#include <stdio.h>
#include <string.h>
int main(void)
{
char *s1 = "ggbondbond";
char *s2 = "bond";
char *p = strstr(s1, s2);
if (NULL == p)
{
printf("没有找到该字符串\n");
}
else
{
printf("找到该字符串\n");
printf("p-s1=%d\n", p - s1);
printf("p=%s\n", p);
}
return 0;
}
PS E:\code\c_code> cd "e:\code\c_code\" ; if ($?) { gcc test2.c -o test2 } ; if ($?) { .\test2 }
找到该字符串
p-s1=2
p=bondbond
6.字符串转换数值
atoi、atol、atof // 字符串转换数值函数
头文件:#include<stdlib.h>
函数原型:int atoi(const char *ptr);
函数功能:将ptr指向的字符串转换成整数,返回
返回值:转换后的整数,如无法转换则返回0
例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char s[10] = "999";
char s1[10] = "999";
char s2[10] = "99.9";
int num = atoi(s);
long num1 = atol(s1);
float num2 = atof(s2);
printf("num = %d\n", num);
printf("num1 = %ld\n", num1);
printf("num2 = %f\n", num2);
/*函数会跳过以转义符开头的空白字符,直到遇到数字或正负号为止,
然后将遇到的数字转换为整数,遇到非数字字符就停止转换*/
char *str = "\t \n -44qwe12";
printf("atoi(str) = %d\n", atoi(str));
return 0;
}
PS E:\code\c_code> cd "e:\code\c_code\" ; if ($?) { gcc test2.c -o test2 } ; if ($?) { .\test2 }
num = 999
num1 = 999
num2 = 99.900002
atoi(str) = -44
7.内存拷贝函数
头文件:#include<string.h>
函数原型: void *memcpy(void *dest, const void *src, size_t n);
功能:
该函数用于从源内存地址 src 处复制 n 个字节的数据到目标内存地址 dest 处。
返回值:
返回指向目标内存地址 dest 的指针。
注意事项:
memcpy 不会检查目标内存区域是否有足够的空间来存储复制的数据,因此需要确保 dest 有足够的空间,否则可能会导致缓冲区溢出。
如果源内存区域和目标内存区域有重叠,memcpy 的行为是未定义的。
例
#include <stdio.h>
#include <string.h>
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
int b[10] = {0};
memcpy(b, a, sizeof(a)); // 拷贝a到b
for (int i = 0; i < 10; i++)
{
printf("%d ", b[i]);
}
return 0;
}