目录:
在我们的C语言中,有关于字符的一系列的函数,给我们使用的字符串、字符进行了分类,他们都需要包含一个头文件:ctype.h

这些关于字符的函数的使用都比较相似,具体我们就举例一到两个例子。

当我们想要知道一个字符是否为小写的时候,我们就能用这个字符函数来进行判断。通过他的返回值来进行判断,如果一个这个函数的返回值是0则这个字符不是小写,如果这个函数的返回值为非0则这个字符是小写。
islower的使用:
例子:将小写转换为大写,其他字符不变。
#include<stdio.h>
#include<ctpye.h>
int main()
{
int i = 0;
char str[] = "heLLo World \n";
char c;
while(str[i])
{
c = str[i];
if(islower(c))
{
c -=32;
}
putchar(c);
i++;
}
}
return 0;
}结果如下:
当我们的字符串进入到while循环当中的时候不断进行判断,i++来改变 数组 中的下标,当遇到小写字母的时候就会进行判断,**小写和大写字母在ASCLL中相差32位。
然后打印出来。**

C语言为我们提供了两个字符转换函数。

当我们不想进行±操作的时候,我们就能直接用这两个函数来帮我们进行字符大小写的转换。
#include<stdio.h>
#include<ctpye.h>
int main()
{
int i = 0;
char str[] = "heLLo World \n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c = toupper(c);
putchar(c);
i++;
}
return 0;
}

**功能:统计 ‘\0’ 之前字符的个数。返回类型:size_t ,这个返回值不会是负数。str 为字符串。使用我们的strlen需要我们包含头文件:string.h
举例:**
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
const char* str = "abcdef";
printf("%zd\n", strlen(str));
return 0;
}
**在我们的strlen中是以\0为结束标志的。
返回值是size_t类型(无符号的整数)**
接下来我们来看另外一个代码。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
const char* str1 = "abcdef";
const char* str2 = "bbb";
if (strlen(str1) - strlen(str2) > 0)
{
printf("str2>str1");
}
else
{
printf("str2<str1");
}
return 0;
}
相信大部分人都想不明白,为什么是小于?明明str2更长
原因就是:strlen求出来的两个数都是无符号的整数,编译器会认为两个无符号的整数进行相减,得到的数还是一个无符号的整数
模拟:
方式1:
//计数器⽅式
int my_strlen(const char * str)
{
int count = 0;
assert(str);
while(*str)
{
count++;
str++;
}
return count;
}方式2:
//不能创建临时变量计数器
int my_strlen(const char * str)
{
assert(str);
if(*str == '\0')
return 0;
else
return 1 + my_strlen(str+1);
}方式3:
//指针-指针的方式
int my_strlen(char *s)
{
assert(str);
char *p = s;
while(*p != '\0')
p++;
return p - s;
}当我们想要去拷贝字符串的时候可以用我们这一个函数。

**功能:字符串拷贝,直到遇到 \0 的时候。
destination:目的地
source:从哪里拷贝
返回值:目标空间的起始地址**
使用演示:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = {0};
char arr2[] = "hello";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
**注意:
字符串必须以 \0 结束
源字符串的 \0 也会被拷入到目的地中
目的地必须足够大
目的地必须是可以修改的**
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest ,const char* src)
{
char* ret = dest;//先存储一份,避免动dest的时候,忽略的光标的位置
assert(dest&&src);//断言一下这两个指针是否为空指针,为空指针就报错
while( *dest++ = *src++)//在这的时候就已经全部进行了拷贝
{
;//空语句,不进行任何操作
}
return ret;//返回dest的首元素的地址
}
int main()
{
char arr1[10] = {0};
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
}

**当我们想要把这个字符串和另一个字符串给连在一起的时候我们就能用这个函数。
功能:字符串追加,把source的字符串全部追加到destination中
destination:目的地
source:来源地
返回值:也是目标空间的首地址**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
**注意:
源字符串必须以’\0’结束
目标空间中也得有’\0’
目标空间必须足够大
目标空间为可修改的**
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest&&src);//断言两个指针是否为空指针
while(*dest)//先找到目标文件中'\0'的位置
{
dest++;
}
while((*dest++ = *src++))//找到之后进行拷贝
{
;//空语句不进行任何的操作
}
return ret;//返回目标文件首元素的地址
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s\n", arr1);//打印字符串
return 0;
}

**当我们想要比较两个字符串的大小的时候,我们可以用这一个函数
功能:字符串的比较,从两个字符串的第⼀个字符开始⽐较,如果两个字符的ASCII码值相等,就⽐较下⼀个字符。直到遇到不相等的两个字符,或者字符串结束。
str1:指针,要比较的第一个字符串
str2:指针,要比较的第二个字符串
返回值:如果第一个字符串比第二个字符串大,则返回一个大于0的数字,如果第一个字符串比第二个字符串小则返回小于0的数字,两个字符串相等则返回0。**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abq";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
if(ret > 0)
printf("arr1 > arr2\n");
else if(ret == 0)
printf("arr1 == arr2\n");
else
printf("arr1 < arr2\n");
return 0;
}
模拟实现:
int my_strcmp (const char * str1, const char * str2)
{
int ret = 0 ;
assert(str1&&str2);
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}

**看见这个是否和我们前面的strcpy很像?其实就是类似的,只不过这个限制了拷贝的字节大小。
destination:指针,要拷贝去的地方
source:指针,要拷贝什么
nun:拷贝限制的大小
返回值:目的地的首元素地址**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = {0};
char arr2[] = "abcdefghi";
char* str = strncpy(arr1, arr2, 5);
printf("%s\n", arr1);
printf("%s\n", str);
return 0;
}

**看到这个我们是不是又想到前面的strcat这个函数?其实这个函数也是限制了要连接的字节大小。
destination:连接的目的地
source:连接的来源,连接什么字符串
num:连接的字节大小
返回值:目的地的首元素地址**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
char* str = strncat(arr1, arr2, 5);
printf("%s\n", arr1);
return 0;
}

**欸?又是和上面相似的函数,字符串比较函数,只不过这个函数限制了比较的个数。
str1:指针,比较的第一个字符串
str2:指针,比较的第二个字符串
num:比较多少个字节**
**第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回小于0的数字**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcqw";
int ret1 = strncmp(arr1, arr2, 3);
printf("%d\n", ret1);
int ret2 = strncmp(arr1, arr2, 4);
printf("%d\n", ret2);
return 0;
}

**功能:查找str2在str1指向字符串的位置。
str1: 被找的字符串
str2: 要寻找的字符串
返回值:如果找到了则返回第一次出现的位置,不存在则返回NULL(空指针)**
举例使用:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="hello world";
char * pc;
pc = strstr (str,"world");
if (pc != NULL)
printf("%s\n", pc);
else
printf("查找的字符串不存在\n");
return 0;
}
模拟实现:
char * my_strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;//存储一份str1的首元素地址
char *s1, *s2;//创建两个临时的指针帮我们存放str1与str2这两个地址
if ( !*str2 )//特殊情况,当str2为空指针的时候返回的就是str1的地址
{
return((char *)str1);
}
while (*cp)//循环遍历cp
//每次遇到相同位置的时候记录一次cp的位置,并把位置交给s1
//让他作为下次寻找的起始位置
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )//当s1与s2相同的时候进入循环。
{
s1++, s2++;
}
if (!*s2)//当s2全部都走完的时候,在s1中找到了s2中全部的元素则返回
//cp记录出现的地址
{
return(cp);
}
cp++;
}
//全部找完的时候没有一次遇到str2里面字符串的数据的时候则返回NULL。
return(NULL);
}
**功能:分割字符串,根据delim里面参数来对str进行分割,拆成多个字符串。
修改原字符串,strtok会在原字符串中插入’\0’
str:首次调用时传入待分割字符串;后续调用传入NULL,表示继续分割同一个字符串
delim:包含分割的字符串
返回值:成功时返回指向当前字子字符串的指针。没有更多子字符串则返回NULL**
使用举例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "192.168.6.111";
const char* sep = ".";
const char* str = NULL;
char buf[30] = {0};
strcpy(buf, arr); //将arr中的字符串拷⻉到buf中,对buf的内容进⾏切割
for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}
**注意:
会直接修改原始字符串,将其中的分隔符替换为‘\0’
多个连续的分隔符会被视为单个分隔符,不会返回空字符串。
:如果输入的str 为NULL 且没有前序调用,行为未定义。**

**功能:可以通过参数部分的errnum来得到错误码,并且返回这个错误信息字符串的首地址。
函数只针对标准库中的函数发⽣错误后设置的错误码的转换。
我们在写代码的过程中难免会碰见不理解,或者根本看不懂的情况,遇到这种情况,我们就能结合我们的错误码来解决问题。
errnum:表示错误码
返回值:函数返回通过错误码得到的错误信息字符串的首字符的地址
使用举例:**
#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i = 0;
for (i = 0; i <= 10; i++)
{
printf("%d: %s\n", i, strerror(i));
}
return 0;
}
举例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE * op = NULL;
op = fopen("data","r");
if(op==NULL)
{
printf("strerror(errno)");
return 1;
}
return 0;
}
完!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。