对于字符串,C语言提供了很多函数来帮助我们处理字符串,这些函数都存在于头文件string.h中。
常用的字符串处理函数有:
- strlen
- strcmp
- strcpy
- strcat
- strchr
- strstr
strlen
- size_t strlen(const char *s);
- 返回s的字符串长度
实现代码如下:
#include<stdio.h>
int myStrLen(const char *str)
{
int cnt = 0;
while(str[cnt] != '\0')
{
cnt++;
}
return cnt;
}
int main(int argc ,char const *argv[])
{
char line[] = "Hello World";
printf("strlen=%lu\n",myStrLen(line));
return 0;
}
strcmp
- int strcmp(const char *s1,const char *s2);
- 比较两个字符串,返回:
- 0:s1==s2
- 大于0:s1>s2
- 小于0:s1<s2
数组实现代码如下:
#include<stdio.h>
int myStrCmp(const char *str1,const char *str2)
{
int idx = 0;
while(str1[idx]== str2[idx] && str1[idx]!='\0'){
idx++;
}
return str1[idx]-str2[idx];
}
int main(int argc ,char const *argv[])
{
char s1[] = "Hello World";
char s2[] = "Hello Worle";
printf("%d\n",myStrCmp(s1,s2));
return 0;
}
指针实现代码如下:
#include<stdio.h>
int myStrCmp(const char *str1,const char *str2)
{
int idx = 0;
while(*str1== *str2 && *str1!='\0')
{
str1++;
str2++;
}
return *str1-*str2;
}
int main(int argc ,char const *argv[])
{
char s1[] = "Hello World";
char s2[] = "Hello Worle";
printf("%d\n",myStrCmp(s1,s2));
return 0;
}
strcpy
- char * strcpy(char *restrict dst,const char *restrict src);
- 把src的字符串拷贝到dst
- restrict表明src和dst不重叠(C99)
- 返回dst
复制一个字符串的常用方法
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
数组实现代码如下:
#include<stdio.h>
char* myStrCpy(char *dst,char *src)
{
int idx = 0;
while(src[idx] != '\0')
{
dst[idx] = src[idx];
idx++;
}
dst[idx] = '\0';
return dst;
}
int main(int argc ,char const *argv[])
{
char s1[] = "";
char s2[] = "Hello World";
myStrCpy(s1,s2);
printf("%s\n",s1);
return 0;
}
指针实现代码如下:
#include<stdio.h>
char* myStrCpy(char *dst,char *src)
{
while(*src != '\0')
{
*dst = *src;
dst++;
src++;
}
*dst = '\0';
return dst;
}
int main(int argc ,char const *argv[])
{
char s1[] = "";
char s2[] = "Hello World";
myStrCpy(s1,s2);
printf("%s\n",s1);
return 0;
}
strcat
- char *strcat(char *dst,const char *src);
- 把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。
- 要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。
- 返回指向dest的指针。
实现代码:
#include<stdio.h>
char* myStrCat(char *dst,const char *src)
{
char *temp = dst;
while(*dst!='\0')
{
dst++;
}
while(*src!='\0')
{
*dst = *src;
dst++;
src++;
}
*dst = '\0';
return temp;
}
int main(int argc ,char const *argv[])
{
char s1[] = "Hello ";
char s2[] = "World";
myStrCat(s1,s2);
printf("%s\n",s1);
return 0;
}
strchr
- char* strchr(const char *s , char c);
- 返回首次出现字符c的位置的指针,如果字符串s中不存在字符c则返回NULL。
实现代码:
#include<stdio.h>
char* myStrChr(char *s,char c)
{
while(*s!='\0' && *s!= c)
{
s++;
}
return *s==c ? s+1 : NULL;
}
int main(int argc ,char const *argv[])
{
char s1[] = "Hello World";
char s2 = 'W';
char *ptr = myStrChr(s1,s2);
printf("%s\n",ptr);
return 0;
}
strstr
- char* strstr(char *str,const char *str2);
- str1:被查找目标
- str2:要查找目标
- 返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
实现代码:
#include<stdio.h>
char* myStrStr(char *s1,const char *s2)
{
bool flag = false;
char *temp1 = s1;
char *temp2 = (char*)s2;
while(*s1 != '\0' )
{
if(*s2 == '\0')
{
flag = true;
break;
}
else if(*s1==*s2)
{
s1++;
s2++;
}
else
{
s1++;
s1 = ++temp1;
s2 = temp2;
}
}
if(flag)
{
return temp1;
}
else return NULL;
}
int main(int argc ,char const *argv[])
{
char s1[] = "Hello World";
char s2[] = "Wor";
char *ptr = myStrStr(s1,s2);
printf("%s\n",ptr);
return 0;
}