所有的字符数组处理函数都包括在 <string.h>这个头文件中
一、strlen 函数
原型:size_t strlen(char const* string);
在C语言中如何计算一个数组或者一个字符数组的长度?在C语言中没有字符串类型,字符串是存放在字符型数组中
,所以一般形式的字符串就是数组。
一般来说,大家都是使用sizeof
来计算数组长度的:
// 整型数组
int a[] = {1,2,3,4,5};
int length = sizeof(a)/sizeof(a[0);
printf("%d",length);
sizeof
是一个操作符,返回的是一个对象或类型所占的字节大小。
但是在字符数组中sizeof
返回的往往不是我们需要的。
因为字符数组的往往需要比其他数组多占一个空间长度。比如一个有效字符串的长度为9,那么实际长度则为10,而第10个字符是'\0'
。表示字符串结束。
使用strlen
函数则会返回有效长度。
#include <stdio.h>
int myLen(const char *line)
{
int strlen = 0;
while (line[strlen] != '\0')
{
strlen++;
}
return strlen;
}
int main(int argc, char const *argv[])
{
char line[] = "hello";
printf("SIZEOF的长度= %d\n", sizeof(line)); //6
printf("strlen的长度= %d", myLen(line)); // 5
return 0;
}
二、strcmp
原型:int strcmp(char const *s1, char const *s2, size_t len);
;
功能:比较两个字符串。如果s1小于s2,strcmp函数返回一个小于零的值。如果s1大于s2,函数返回一个大于零的值。如果两个字符串相等,函数就返回零。
#include <stdio.h>
#include <string.h>
int mycmp(const char *c1, const char *c2)
{
while (*c1 == *c2 && *c1 == '\0') // 通过指针的自增来比较,同时判断是否有到了结束位置
{
c1++;
c2++;
}
int result = *c1 - *c2;
return result == 0 ? 0 : (result > 0) ? 1 : -1;
}
int main(int argc, char const *argv[])
{
char char1[] = "bb";
char char2[] = "a";
printf("%d\n", strcmp(char1, char2)); // 1
printf("%d", mycmp(char1, char2)); // 1
return 0;
}
三、strcat函数
原型:char *strcat(char *dst, char const *src);
功能:将一个字符串添加(连接)到另一个字符串的后面。
注意:src和dst的所指的内存区域不能重叠,如果发生重叠,其结果是未定义的。
#include <stdio.h>
#include <string.h>
char *mycat(char *des, const char *src)
{
char *temp = des; //定义临时指针指向目标字符数组
temp = des + strlen(des); //将目标字符串移入到结尾
while (*temp++ = *src++) //通过指针自增实现赋值
*temp = '\0'; //将目标字符串的结尾
return des;
// char *temp = des;
// while (*temp != '\0')
// {
// temp++;
// }
// while ((*temp++ = *src++))
// *temp = '\0';
// return des;
}
int main(int argc, char const *argv[])
{
/* code */
char c1[] = "hello";
char c2[] = "world";
printf("%s\n", mycat(c1, c2)); //helloworld
return 0;
四、strcpy
原型:char *strcpy(char *dst, char const *src);
功能:将参数src字符串复制到dst参数中。如果参数src和dst在内存中出现重叠,其结果是未定义的。由于dst参数将进行修改,所以它必须是个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量
。返回参数dst的一份拷贝。
注意:
目标参数dst的以前内容将被覆盖并丢失。即使新的字符串比dst原先的内存更短,由于新字符串是以NUL字符结尾,所以老字符串最后剩余的几个字符也会被有效的删除。如果字符串比数组长,多余的字符仍被复制,它们将覆盖原先存储于数组后面的内存空间的值
。所以必须保证目标字符数组的空间足以容纳需要复制的字符串。
#include <stdio.h>
#include <string.h>
char *mycpy(char *dst, char *const restrict src)
{
int idx = 0;
while (c2[idx])
{
dst[idx] = src[idx];
idx++;
}
dst[idx] = '\0';
return dst;
}
int main(int argc, char const *argv[])
{
char c1[] = "adcdee";
char c2[] = "eeeeddddddddd";
printf("%s\n", strcpy(c1, c2)); //eeeeddddddddd
printf("%s\n", mycpy(c1, c2)); //eeeeddddddddd
return 0;
}
五、strchr函数
原型:char *strchr(char const *str, int ch);
功能:在一个字符串中查找一个特定字符。
注意:第2个参数是一个整型值。但是,它包含了一个字符值。strchr在字符串str中查找字符ch第一次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于str中,函数就返回一个NULL指针。strrchr的功能和strchr基本一致,只是它所返回的是一个指向字符串中该字符最后一次出现的位置(最右边那个)。
为了直观编程显示,第二个参数设成字符型
#include <stdio.h>
#include <string.h>
char *Strchr(char *dst, const char str)
{
while (*dst != '\0')
{
if (*dst == str)
{
return dst;
}
dst++;
}
return NULL;
}
int main(int argc, char const *argv[])
{
char c1[] = "hello";
char *p = strchr(c1, 'l');
printf("%s\n", p); //llo
printf("%s\n", Strchr(c1, 'l')); //llo
return 0;
}
// 暂时就总结这么多,以后补充