<string.h>
求字符串长度
strlen 查询字符串长度
strlen(字符串名字);
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {
char arr[] = "abcd";
int len = strlen(arr);
printf("%d", len);
return 0;
}
模拟strlen函数实现
int My_strlen(const char * p) {
int i = 0;
assert(p != NULL);
while (*p != '\0')
{
i++;
p++;
}
return i;
}
注如果定义的是{}这样形式的字符串数组,会出现错误,因为没有\0
字符串以及‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’)
参数指向的字符串必须要以‘\0’结束。
注意函数的返回值是size_t,是无符号的
且两个无符号数相减,也是没有负数的
长度不受限制的字符串函数
strcpy 这个函数把字符串复制到一分配好的字符串空间中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回这个字符
strcpy(字符串1, 字符串2);
注:当字符串中没有\0时不能运行,同时字符串2也不能超过字符串1的长度
char str1[] = "abcdef";
char str2[] = "1234";
strcpy(str1, str2);
printf("%s\n", str1);
源字符串必须以'\0'结束
会将源字符串中的'\0'拷贝到目标空间
目标空间必须足够大,以确保能存放源字符串
目标空间必须可变
模拟实现strcpy函数
void mystrcpy(char* str1, char const* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
}
strcat 字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。
strcat(字符串1, 字符串2)
char str1[20] = "abcdef ";
char str2[] = "1234";
strcat(str1, str2);
源字符串必须以'\0'结束
目标空间必须足够大,以确保能存放源字符串
目标空间必须可变
模拟实现strcat函数
void mystrcat(char* str1, char const* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 != '\0')
{
str1++;
}
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
}
strcmp 用来比较两个字符串
strcmp(字符串1,字符串2)
int main() {
char str1[] = "abci";
char str2[] = "abc";
int ret1 = strcmp(str1, str2);
printf("%d\n", ret1);
}
大于0是字符串1大于字符串2
小于0是字符串1小于字符串2
等于0是字符串1等于字符串2
int mystrcmp(char const* str1, char const* str2)
{
while (1)
{
int x = *str1 - *str2;
if (x > 0)
{
return 1;
}
else if (x<0)
{
return -1;
}
if (*str1 =='\0' && *str2 == '\0')
{
return 0;
}
str1++;
str2++;
}
}
长度受限制的字符串函数
这些都和上面的差不多,只不过有了长度要求,其中n就是对长度的要求
strncpy
strncpy(字符串1,字符串2,拷贝的字符个数);
int main() {
char str1[20] = "abcd";
char str2[] = "123";
strncpy(str1, str2, 2);
printf("%s\n", str1);
}
模拟实现strncpy函数
char* mystrncpy(char* str1, char const * str2, int n) {
assert(str1 != NULL);
assert(str2 != NULL);
for (int i = 0; i < n; i++)
{
*(str1+i) = *(str2+i);
if (*str2 == '\0')
*str1 = '\0';
}
}
strcat
strncmp
字符串查找
strstr 在一个字符串中找另外一个字符串
strstr(字符串1,字符串2)
int main() {
char str1[] = "abcdef";
char str2[] = "abc";
char* ret1 = strstr(str1, str2);
if (ret1 == NULL)
{
printf("没找到\0");
}
else
{
printf("找到了\0");
}
return 0;
}
模拟实现strstr函数
char * mystrstr(const char* str1, const char* str2)
{
assert(str1 && str2);
int count = 0;
char* p = str2;
while (1)
{
while (*str1 == *str2)
{
count++;
str1++;
str2++;
}
str1 = str1 - count;
if (*str2 != '\0')
{
str2 = p;
count = 0;
}
else
{
return str1 - count;
}
if (*str1 == '\0')
{
return NULL;
}
str1++;
}
}
strtok 用来切割字符串
char * strtok (char * str,const char * sep)
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或多个分隔符分割的标记
strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针
(注:strtok函数会改变操作符的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改)
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串的位置
strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
如果字符串中不存在更多的标记,则返回NULL指针
int main() {
char str[] = "abcdiu/sfffgh*avavdv-gigqv";
char* p = "/*-";
char* ret = NULL;
char newstr[50] = { 0 };
strcpy(newstr, str);
for (ret=strtok(newstr,p);ret != NULL;ret=strtok(NULL,p))
{
printf("%s\n", ret);
}
}
错误信息报告
strerror 返回错误码,所对应的错误信息
使用库函数的时候
调用库函数失败的是,都会设置错误码
全局的错误码
#include<errno.h>
strerror(errno);