字符串与字符函数(一)
1、求字符串长度:strlen
1.1 strlen的用法
strlen 是求字符串长度的函数
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] ="abcdefg";
int len = strlen(arr);
printf("%d\n",len);
//运行结果为:7
//每个字符串的末尾处隐藏了一个"\0",strlen用来求字符串长度,本质上是从第一个字符开始
//计算,一直到"\0"之前的所有字符个数(不包括"\0")。
return 0;
}
1.2 strlen的模拟实现
1.2.1 计数法
#include <stdio.h>
int my_strlen(char* str)
{
int count = 0;
while (*str!='\0') // "abcdefg\0"
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdefg";
int len= my_strlen(arr);
printf("%d\n",len);
return 0;
}
1.2.2 递归法
#include <stdio.h>
int my_strlen(char* str) //"abcdefg\0"
{
if (*str=='\0')
{
return 0;
}
else
{
return 1 + my_strlen(str+1);
}
}
int main()
{
char arr[] = "abcdefg";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
1.2.3 指针减指针
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str) //"abcdefg\0"
{
assert(str);
const char* str1 = str;
while (*str1!='\0')
{
str1++;
}
return str1 - str;
}
int main()
{
char arr[]="abcdefg";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
2、长度不受限制的字符串函数
2.1 strcpy
2.1.1 strcpy的用法
strcpy(拷贝源字符串的内容覆盖掉目标空间的内容)
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "#####################";
char arr2[] = "Hello,bit";
strcpy(arr1,arr2);
//strcpy函数的作用是将:源字符串arr1中的内容拷贝到目标空间arr2中(arr1末尾的'\0'也被拷贝过去)
printf("%s\n",arr1);
return 0;
}
2.1.2 strcpy的模拟实现
#include <stdio.h>
#include <assert.h>
//my_strcpy的函数返回类型为:目标空间的起始地址。
//设置成char* ,是为了实现链式访问
char* my_strcpy(char* dest,const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "###################";
char arr2[] = "Hello,bit";
printf("%s\n", my_strcpy(arr1, arr2));//链式访问
return 0;
}
2.2 strcat
2.2.1 strcat的用法
strcat 函数追加(将源字符串的内容 追加到 目标字符串的末尾)
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "Hello";
char arr2[] = ",bit";
strcat(arr1,arr2);
printf("%s\n",arr1);
//结果为:Hello,bit
return 0;
}
2.2.2 strcat的模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strcat( char* dest,const char* src)
{
assert(dest&&src);
//找到目标空间中的 '\0'
char* ret = dest;
while (*dest!='\0')
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "Hello";//目标空间需要足够大,才能够放得下源字符串
char arr2[] = ",bit";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
2.3 strcmp
2.3.1 strcmp的用法
该函数比较的不是字符串的长度,而是比较字符串中对应位置上的字符的大小,如果相同,就比较下一对,直到不同或者都遇到’\0’。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcf";
int ret=strcmp(arr1,arr2);
if (ret==1)
{
printf(">\n");
}
else if (ret==0)
{
printf("=\n");
}
else
{
printf("<\n");
}
return 0;
}
2.3.2 strcmp的模拟实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* s1,const char* s2)
{
assert(s1 && s2);
while (*s1==*s2)
{
if (*s1=='\0')
{
return 0;//相等的情况
}
s1++;
s2++;
}
//不相等的情况
if (*s1 > *s2)
return 1;
else
return -1;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcf";
int ret = my_strcmp(arr1, arr2);
if (ret == 1)
{
printf(">\n");
}
else if (ret == 0)
{
printf("=\n");
}
else
{
printf("<\n");
}
return 0;
}
3、长度受限制的字符串函数
3.1 strncpy
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "###";
strncpy(arr1,arr2,2);
//这里的2,代表拷贝的字符数量(如果字符数量大于源字符串的字符数量,多余的就用'\0'代替).
printf("%s\n",arr1);
return 0;
}
3.2 strncat
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abcdef\0###########";
char arr2[] = "qwert";
strncat(arr1,arr2,3);
printf("%s\n",arr1);
return 0;
}
3.3 strncmp
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcef";
int ret = strncmp(arr1,arr2,4);
//这里的4意味着,比较两个字符串前4个字符的大小。
printf("%d\n",ret);
return 0;
}
本文介绍了C语言中几个重要的字符串处理函数,包括strlen用于计算字符串长度,通过计数法、递归法和指针减指针三种方式实现;strcpy和strcat分别用于完全复制和追加字符串;strcmp用于比较字符串,以及它们的模拟实现。另外还提到了长度受限制的strncpy、strncat和strncmp函数。

被折叠的 条评论
为什么被折叠?



