欢迎光临
我们一直在努力

字符与字符串函数

字符与字符串函数

  • 字符函数
    • 字符小写判断
      • 字符大写判断
      • 判断是否数字字符
  • 字符串函数
    • strlen
      • 1.补充一种模拟方法
      • 2.注意返回值
    • strcpy
      • 代码演示
      • 模拟实现
    • strcat
      • 代码演示
      • 模拟实现
    • strcmp
      • 代码演示
    • strncpy
      • 代码演示
      • 模拟实现
    • strncat
      • 代码演示
      • 模拟实现
    • strncmp
      • 代码演示
      • 模拟实现
    • strstr
      • 代码演示
      • 模拟实现
    • strtok
      • 代码演示
  • 在这里插入图片描述 这种有个问题就是,我们是知道分割有多少的部分,那如果在不知道具体分割多少部分,该怎么打印?
    • strerror
      • 代码演示

字符函数

在这里插入图片描述 这里说明常见的字符函数,这些知道了,剩下的都是一个套路; 包含头文件==#include<ctype.h>==

字符小写判断

islower 格式:

int islower(int c);

返回值为布尔类型:非零为true,零为false; 字符判断,就是看ASCLL码值

//字符判断大小写
#include<stdio.h>
#include<ctype.h>
int main()
{
char a = 'a';
int res = islower(a);
if (res) {
printf("小写字符\\n");

}
else
{
printf("大写字符\\n");
}
return 0;
}

在这里插入图片描述 题目:将小写字符转化为大写字符

//题目:将小写字符转化为大写字符
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "HeLLo,World";
size_t len = strlen(arr);
for (int i = 0; i < len; i++) {
if (islower(arr[i])) {
arr[i] = arr[i] 32;
}
}
printf("%s", arr);
return 0;

}

在这里插入图片描述 题目:将大写字符转化为小写字符

#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "HeLLo,World";
size_t len = strlen(arr);
for (int i = 0; i < len; i++) {
if (isupper(arr[i])) {
arr[i] = arr[i] + 32;
}
}
printf("%s", arr);
return 0;

}

在这里插入图片描述

字符大写判断

isupper 格式:

int isupper(int c);

//字符大写判断
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = "A";
int res = isupper(ch);
if (res > 0) {
printf("大写字符");
}
else {
printf("小写字符");
}
return 0;
}

在这里插入图片描述

判断是否数字字符

#include<stdio.h>
#include<ctype.h>
int main()
{
char a = 'c';
int res = isdigit(a);
if (res > 0) {
printf("数字字符");
}
else {
printf("不是数字字符");
}
return 0;
}

在这里插入图片描述 其余字符函数都是差不多的,可以类比自己使用;

字符串函数

头文件:#include<stdio.h>

strlen

这个不过多讲,说两点:

1.补充一种模拟方法

//递归实现strlen的模拟
#include<stdio.h>
#include<string.h>
size_t My_strlen(const char* arr) {
if (*arr == '\\0') {
return 0;
}
return My_strlen(arr+1) + 1;

}
int main()
{
char arr[] = "abcdef";
size_t res = My_strlen(arr);
printf("长度:%d", res);
return 0;
}

在这里插入图片描述

2.注意返回值

strlen格式:

size_t strlen(const char *str)

strlen的返回值为size_t,无符号整型;

//看题比较大小

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdef";
if (strlen(arr1) strlen(arr2) < 0) {
printf("<");
}
else
printf(">");
return 0;
}

注意在这题中打印出来的是大于号 strlen算出的是无符号类型size_t,相减是无符号的类型,得出的转化为补码 是一个非常大的正数 在这里插入图片描述

strcpy

strcpy的作用是==string copy ==:字符串的拷贝 格式:

char *strcpy(char *dest, const char *src)

返回值为目标空间的起始地址,参数为两个字符指针,目标空间dest,源空间src

代码演示

//strcpy
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";

strcpy(arr1, arr2);
printf("arr1:%s\\n", arr1);
return 0;
}

在这里插入图片描述

这里的目标字字符串空间一定要够大 在这里插入图片描述

模拟实现

#include<stdio.h>
#include<string.h>
char* My_strcpy(char* dest,char*sor) {
char* fla = dest;
while (*dest++ = *sor++) {
;
}
return dest;
}
int main()
{
char arr1[100] = {0};
char arr2[] = "hello world";

My_strcpy(arr1, arr2);
printf("arr1:%s\\n", arr1);
return 0;
}

在这里插入图片描述

strcat

字符串拼接:strcat 格式: char *strcat(char *dest, const char *src) 返回值为目标空间的起始地址,,参数为两个字符指针,目标空间dest,源空间src 这里的拼接必须是从目标字符串的==\\0==开始追加

代码演示

//strcat字符串的拼接
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}

在这里插入图片描述

模拟实现

#include<stdio.h>
#include<string.h>
char* My_strcat(char* dest, char* src) {
//找到目标字符的‘\\0’
char* fla = dest;//标记起始地址
while (*dest!='\\0') {
dest++;
}
while (*dest++=*src++) {
;
}
return fla;
}
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
My_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}

在这里插入图片描述

strcmp

strcmp字符串比较大小 格式:

int strcmp(const char *str1, const char *str2)

代码演示

#include<stdio.h>
int main()
{
char arr1[] = "abd";
char arr2[] = "abcdef";
int res = strcmp(arr1,arr2);
if (res > 0) {
printf("arr1>arr2");

}
else if (res < 0) {
printf("arr1<arr2");
}
else
printf("arr1==arr2");
return 0;
}

在这里插入图片描述 模拟实现:

#include<stdio.h>
int My_strcmp(const char* str1, const char* str2) {
while (*str1 == *str2) {
str1++;
str2++;
}
return *str1 *str2;
}
int main()
{
char arr1[] = "abd";
char arr2[] = "abcdef";
int res = My_strcmp(arr1, arr2);
if (res > 0) {
printf("arr1>arr2");

}
else if (res < 0) {
printf("arr1<arr2");
}
else
printf("arr1==arr2");
return 0;
}

strncpy

strncpy:字符串的拷贝 格式:

char *strncpy(char *dest, const char *src, size_t n)

dest – 指向用于存储复制内容的目标数组。 src – 要复制的字符串。 n – 要从源中复制的字符数。

代码演示

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "hello word";
char arr2[100] = { 0 };
strncpy(arr2, arr1,5);
printf("%s", arr2);
return 0;
}

在这里插入图片描述

模拟实现

#include<stdio.h>
#include<string.h>
char* My_strncpy(char* dest, const char* src, size_t n) {
char* fla = dest;
while (n) {
*dest++ = *src++;
n;
}
return fla;
}
int main()
{
char arr1[] = "hello word";
char arr2[100] = { 0 };
My_strncpy(arr2, arr1,5);
printf("%s", arr2);
return 0;
}

在这里插入图片描述 在这里插入图片描述

strncat

strncat的使用 格式:

char *strncat(char *dest, const char *src, size_t n)

参数 dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。 src – 要追加的字符串。 n – 要追加的最大字符数。

代码演示

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}

模拟实现

char* My_strncat(char* dest, const char* src, size_t n) {
char* fla = dest;
while (*dest != '\\0') {
dest++;
}
while (n) {
*dest++ = *src++;
n;
}
return fla;
}
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[100] = "hello";
char arr2[] = "world";
My_strncat(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}

在这里插入图片描述

strncmp

strncmp 格式:

int strncmp(const char *str1, const char *str2, size_t n)

str1 – 要进行比较的第一个字符串。 str2 – 要进行比较的第二个字符串。 n – 要比较的最大字符数。

代码演示

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcd";
char arr2[] = "abe";
int res = strncmp(arr1, arr2, 2);
if (res > 0) {
printf(">");
}
else if (res < 0) {
printf("<");
}
else printf("=");
return 0;
}

模拟实现

#include<stdio.h>
#include<string.h>
int My_strncmp(const char* str1, const char* str2, size_t n) {
if (n == 0) {
return 0;
}
while (n > 0) {
if (*str1 != *str2) {
return (*str1 *str2);
}
if (*str1 == '\\0') {
return 0;
}
str1++;
str2++;
n;
}
return 0;
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abe";
int res = My_strncmp(arr1, arr2, 2);
if (res > 0) {
printf(">");
}
else if (res < 0) {
printf("<");
}
else printf("=");
return 0;
}

在这里插入图片描述

strstr

strstr字符串中寻找字符串 格式:

char *strstr(const char *haystack, const char *needle);

haystack – 要搜索的主字符串。 needle – 要查找的子字符串。

代码演示

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "def";
char* res = strstr(arr1, arr2);
printf("%s", res);
return 0;
}

在这里插入图片描述

模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* My_strstr(const char* str1, const char* str2) {
assert(str1 && str2);
char* cp = str1;
char* sp = NULL;
while (*cp) {
cp = str1;
sp = str2;
while (*cp == *sp) {
cp++;
sp++;
}
if (*sp == '\\0') {
return str1;
}
str1++;
}
return NULL;
}
int main()
{

char arr1[] = "abcdefg";
char arr2[] = "def";
char* res = My_strstr(arr1, arr2);
printf("%s", res);
return 0;
}

在这里插入图片描述

strtok

strtok 分割字符串,比较特殊,注意关注; 格式:

char *strtok(char *str, const char *delim)

str: 要分割的字符串。在第一次调用时,传入要分割的字符串;后续调用时,传入 NULL,表示继续分割同一个字符串。 delim: 分隔符字符串。strtok() 会根据这个字符串中的任意一个字符来分割 str。

代码演示

#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "lguotao@qq.com";
char* ch = "@.";
char* res = strtok(arr, ch);
printf("%s\\n", res);
res = strtok(NULL, ch);
printf("%s\\n", res);
res = strtok(NULL, ch);
printf("%s\\n", res);
return 0;
}

在这里插入图片描述 这种有个问题就是,我们是知道分割有多少的部分,那如果在不知道具体分割多少部分,该怎么打印?

要用到循环

#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "lguotao@qq.com";
char* ch = "@.";
char* res;
for (res = strtok(arr, ch); res != NULL; res = strtok(NULL, ch)) {
printf("%s\\n", res);
}
return 0;
}

在这里插入图片描述

strerror

这个函数是用来找库函数错误出现的原因; 每一个错误都会有对应的错误码,0~9是对应错误的错误码

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
for (int i = 0; i < 10; i++) {
printf("%d:%s\\n", i, strerror(i));
}
return 0;
}

在这里插入图片描述

代码演示

打印出错误需要用到errno函数,对应头文件为==#include<errno.h>==

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* res = fopen("bit.txt", "r");//这是用于打开文件,了解一下;
//返回值为FILL*,如果打开没有或者失败,返回NULL
if (res == NULL) {
printf("错误的原因:%s",strerror(errno));
}
else
printf("成功");
return 0;
}

在这里插入图片描述 对于打印错误,C提供了一种函数叫perror,头文件为==#include<stdio.h>==

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
FILE* res = fopen("bit.txt", "r");//这是用于打开文件,了解一下;
//返回值为FILL*,如果打开没有或者失败,返回NULL
if (res == NULL) {
perror("错误的原因:");//直接用这个打印错误
}
else
printf("成功");
return 0;
}

在这里插入图片描述

根据需要,自己选择;

大家点点关注,🦀🦀 下期内存函数

赞(0)
未经允许不得转载:171主机测评 » 字符与字符串函数
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址