更多精彩文章请关注公众号『大海的BLOG』
字符串处理函数
1.简介
- 在c语言的学习过程中,我们会学习很多字符串处理函数,入strlen,strcpy,strcmp等等,使用也特别简单,只需要调用库函数就行。
- 但是对于c语言初学者来说,作为一个面向过程的语言,了解其函数内的实现过程还非常用必要的。
2.字符串实现函数
strcpy(字符串拷贝函数)
#include <stdio.h>
#define M 50
//指针函数 返回值为指向字符串str1的指针
char *strcpy(char * str1, const char * str2 )
{
//判断 是否为空指针
if(str1 == NULL || str2 == NULL)
{
return NULL;
}
char *p = str1;
while((* str1++ = * str2++) != '\0');
return p;
}
int main()
{
char str1[M]={0};
char str2[M]={0};
printf("please input str1\r\n");
fgets(str1,50,stdin);
char *p = strcpy(str2,str1);
puts(str2);
return 0;
}
运行结果
注意:fgets输入的时候会将缓存区里面的回车换行
作为笔试题考察点有四处
- 异常处理 str1,str2 是否为NULL
- const 的修饰,str2不能被修改需要const来修饰
- 字符串会拷贝 ‘\0’
- 返回值(指向str2的指针),可以方便调用者调用
strcmp(字符串比较大小)
**#include <stdio.h>
#define M 50
#define N 50
int Strcmp(const char *str1,const char *str2);
int main()
{
//输入两个字符串
char str1[M]={0};
char str2[N]={0};
printf("please input str1\r\n");
scanf("%s",str1);
printf("please input str2\r\n");
scanf("%s",str2);
//比较两字符串的大小
Strcmp(str1,str2);
return 0;
}
int Strcmp(const char *str1,const char *str2)
{
//判断 是否为空指针
if(str1 == NULL || str2 == NULL)
{
return;
}
int i=0;
while(*(str1+i)==*(str2+i) && *(str1+i)!='\0')
{
i++;
}
if( *(str1+i)>*(str2+i) )
{
printf("str1>str2\r\n");
return 1;
}
else if( *(str1+i) < *(str2+i) )
{
printf("str1<str2\r\n");
return -1;
}
else
{
printf("str1=str2\r\n");
return 0;
}
}
运行结果
作为笔试题考点同上
strcat (字符串拼接函数)
#include <stdio.h>
#include <string.h>
#define M 50
#define N 50
char *str_cat(char*,char*);
int main()
{
char str1[M]={0};
char str2[N]={0};
//输入两个字符串
printf("please input str1\r\n");
scanf("%s",str1);
printf("please input str2\r\n");
scanf("%s",str2);
char *p=str_cat(str1,str2);
puts(p);
return 0;
}
//字符串拼接
char *str_cat(char *str1,char *str2)
{
//判断 是否为空指针
if(str1 == NULL || str2 == NULL)
{
return;
}
//字符串str1的长度
int j=strlen(str1);
//字符串str2的长度
int k=strlen(str2);
if( M < (j+k) )
{
return ;
}
//定义两个指针
char *pp=str1;
char *p=str1+j;
char *q=str2;
int i=0;
for(i=0;i<k;i++)
{
*(p+i) = *(q+i);
}
return pp;
}
运行结果
strlen(求字符串的长度)
#include <stdio.h>
int mystrlen(char *pStr);
int main()
{
char str[100] ={0};
printf("please input str\r\n");
scanf("%s",str);
//用变量a来接受函数的返回值
int a=mystrlen(str);
printf("%d\r\n",a);
return 0;
}
//求字符串的长度
int mystrlen(char *pStr)
{
if(NULL==pStr)
{
return -1;
}
int i=0;
while(pStr[i] !='\0')
{
i++;
}
return i;
}
注意:strlen 和 sizeof的区别
- strlen 计算字符串的长度,不计算字符串的结束标识符 ‘\0’
- sizeof 计算的是占空间的大小会计算进去
字符串的翻转
*方法一 *
#include <stdio.h>
#include <string.h>
#define n 50
int main()
{
//输入字符
char arr[n]={0};
scanf("%s",arr);
char *p=arr;
char *q=&arr[strlen(arr)-1];
int i=0;
//用指针p指向首地址,q指向字符的尾地址
for(i=0;i<strlen(arr)/2;i++)
{
char tmp= *(p+i);
*(p+i)=*(q-i);
*(q-i)=tmp;
}
puts(arr);
return 0;
}
方法二
#include <stdio.h>
#include <string.h>
int main()
{
char str[100]={0};
gets(str);
char *p=str;
char *q=str+strlen(str)-1;
while(p<q)
{
int tmp=*p;
*p=*q;
*q=tmp;
p++;
q--;
}
puts(str);
return 0;
}
字符串的查找
编写一个字符串查找函数,函数原型为:
char *str_search(const char *str1, const char *str2),
该函数实现在字符串str1中找出字符串str2第一次出现的位置。
如果str2出现在str1中,则返回str2在str1中出现的首地址,
如果在str1中没有与str2匹配的字符串则返回NULL
#include <stdio.h>
#include <string.h>
char *str_search( char *str1, char *str2 );
int main()
{
//定义两个字符串
char str1[20] = {0};
char str2[20] = {0};
//赋值
scanf("%s",str1);
scanf("%s",str2);
char *q = str_search(str1,str2);
printf("%s\r\n",q);
return 0;
}
char *str_search( char *str1, char *str2 )
{
//定义一个指针指向 str1
char *p = str1;
//逐个移动比较
int i = 0;
for( i=0; i < strlen(str1); i++ )
{
char tmp = *( p+strlen(str2)+i );
*( p+strlen(str2)+i ) = '\0';
//比较两个字符串
if( 0 == strcmp( str1+i, str2 ) )
{
return p+i;
}
*( p+strlen(str2)+i ) = tmp;
}
return NULL;
}
更多精彩文章请关注公众号『大海的BLOG』