做网站用西安网站设计开发
前言
本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看
1字符函数
在讲解字符函数时,大家得了解什么是字符吧
普通字符'a' ' b' 'c' '1' ' @' 转义字符' \n ' 换行‘ \t’ 水平制表符'\r'回车
大家了解即可
在C语言中字符也可以有分类
所以我们先来看看字符分类函数
1.1字符分类函数
大家看以上函数的参数返回值以及它的功能几乎一致
我们这里以这个函数为例
int isdigit ( int c );
isdigital 是能够判断参数部分的 c 是否是字符‘0’--‘9’的
代码
#include <stdio.h>
#include <ctype.h>
int main ()
{char str[]="1776ad";int size=sizeof(str)/sizeof(str[0]);while(size){if(isdigit(str[0]))printf("该字符为数字字符%c\n",str[0]);size--;}return 0;
}
该代码能够把一个字符串中的数字字符找到
看看返回值
A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.
如果c确实是十进制数字,则为与零不同的值(即true)。否则为零(即false)
再举一个例子
int islower ( int c );
看代码
#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c)) c -= 32;putchar(c);i++;}return 0;
}
该代码的作用是将字符串中的⼩写字⺟转⼤写,其他字符不变
当然咱么是个细节的人,看看返回值
value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.
如果c确实是小写字母,则值与零不同(即true)。否则为零(即false)
上面的每一个函数的表达式几乎一样,这里不再赘述,注意还是要看看返回值的含义
而且,发现了没有参数是int但是功能却是判断字符串
主要是中间其实发生了类型转换,本身int类型是大于char类型的
1.2字符转换函数
我们在这里讲解两个
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c );//将参数传进去的⼩写字⺟转⼤写
值得注意的是,他是完全可以有我们自主实现的
那么,我们可以模拟实现该函数
当然我们上一个代码其实就是它的模拟实现
所以,我们只是举一个例子就好
#include<ctype.h>
#include<stdio.h>
int main()
{
char a[]="jdkalkdkjakldkj\n";
int i=0;
while(a[i])
{
toupper(a[i]);
puchar(a[i])
i++;
}
return 0;
}
这个代码就是把小写字母变为大写字母
2字符串函数
2.1 strlen 的使⽤和模拟实现
定义
size_t strlen ( const char * str );
作用计算字符串的长度
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数 不包 含 '\0'
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件
1strlen的使用
看代码
#include<string.h>
#include<stdio.h>
int main()
{char a[]=“jdlkalkdjkllkakldjkl”;
strlen(a);
return 0;
}
其实这个代码就是计算了字符串的长度
2模拟实现
分析 首先strlen函数得要接收一个地址类型是char *
返回一个无符号的数代表该字符串的长度
代码1实现
size_t My_strlen(const char* dest)
{assert(dest);int count = 0;while (*dest++)//当* dest为\0时 它的ASCLL码值为0{count++;}return count;
}
int main()
{char a[] = "jkaldkljda";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
看结果
代码2实现
size_t My_strlen(const char* dest)
{assert(dest);char* p1 = (char *)dest;while (*dest++);//当* dest为\0时 它的ASCLL码值为0return dest-p1-1;
}
int main()
{char a[] = "jkaldkljdadakjkjlaksc";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
其实就是把最后结果变为 指针-指针
但是由于*dest为‘\n’时有后置加加所以要多减去一个1
结果是一样的
2.2strcpy 的使⽤和模拟实现
• Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
• 源字符串必须以 '\0' 结束
• 会将源字符串中的 '\0' 拷⻉到⽬标空间
• ⽬标空间必须⾜够⼤,以确保能存放源字符串
• ⽬标空间必须可修改
上面同样是注意事项
1strcpy的使用
int main()
{char a[10] = "djklak";char b[20] = { 0 };strcpy(b, a);printf("%s", b);return 0;
}
2strcpy的模拟实现
char *strcpy( char *strDestination, const char *strSource );
返回值为目的地址
看代码
char *My_strcpy(char *dest,const char *src)
{assert(dest && src);char* p1 = dest;while (*dest++ = *src++);return p1;
}
看结果
3.3.strcat 的使⽤和模拟实现
• Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
源字符串必须以 '\0' 结束 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。
1strcat的使用
看代码
int main()
{char a[20] = "hello";char b[10] = " world";strcat(a, b);printf("%s\n", a);return 0;
}
2strcat的模拟实现
char *strcat( char *strDestination, const char *strSource );
char* My_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*(++dest));while (*dest++ = *src++);return ret;
}
int main()
{char a[20] = "hello";char b[10] = " world";char c[20] = "hello";My_strcat(a, b);strcat(c, b);printf("%s\n", a);printf("%s\n", c);return 0;
}
看结果
3.4strcmp 的使⽤和模拟实现
• This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
•标准规定:第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩
1strcmp的使用
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag = strcmp(a, b);if (flag > 0)printf("第一个字符串大\n");else if (flag == 0)printf("两个一样大\n");elseprintf("第二个字符串的\n");return 0;
}
2strcmp的模拟实现
int strcmp( const char *string1, const char *string2 );
int My_strcmp(const char* string1,const char *string2)
{assert(string1 && string2);while (*string1 && *string2){if (*string1 == *string2){string1++; string2++;}elsebreak;}return *string1 - *string2;
}
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag1=strcmp(a, b);int flag2 = My_strcmp(a, b);if (flag1*flag2>=0)printf("模拟成功\n");if (flag1 > 0)printf("第一个字符串大\n");else if (flag1== 0)printf("两个一样大\n");elseprintf("第二个字符串大\n");return 0;
}
看结果
3.5strncat 的使⽤和模拟实现
strncat就是多了个参数,限定copy的字符串大小
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符
如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾
1strncat的使用
#include <stdio.h>
#include <string.h>
int main ()
{char str1[20];char str2[20];strcpy (str1,"To be ");strcpy (str2,"or not to be");strncat (str1, str2, 6);printf("%s\n", str1);return 0;
}
2strncat的模拟实现
char * strncat ( char * destination, const char * source, size_t num );
char *My_strncat(char *dest,const char *src,size_t n)
{char* ret = dest;assert(dest && src);while (*(++dest));while (n--&&*src)*dest++ = *src++;*dest = '\0';return ret;
}
int main()
{char str1[20];char str2[20];char str3[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strcpy(str3, "To be ");My_strncat(str1, str2, 6);strncat(str3, str2, 6);printf("%s\n", str1);printf("%s\n", str3);return 0;
}
看结果
3.6strncmp的使⽤和模拟实现
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
1strncmp的使用
#include <stdio.h>
#include <string.h>
int main ()
{char *p1="abcde";char *p2="abcfe";int a=strncmp(p1,p2,3);
if(a>0)
printf("第一个字符串在前3个字符中更大\n");
else if(a=0)
printf("两个字符串在前3个字符中一样大\n");
else
printf("第二个字符串在前3个字符中更大\n");return 0;
}
2strncmp模拟实现
int My_strncmp(const char* str1, const char* str2,size_t n)
{assert(str1 && str2);while (n--&& *str1 && *str2){if (*str1 == *str2){str1++; str2++;}}return *str1 - *str2;
}
int main()
{char* p1 = "abcde";char* p2 = "abcfe";int a = strncmp(p1, p2, 3);int b = My_strncmp(p1, p2, 3);if (a * b >= 0)printf("模拟成功\n");if (a > 0)printf("第一个字符串在前3个字符中更大\n");else if (a==0)printf("两个字符串在前3个字符中一样大\n");elseprintf("第二个字符串在前3个字符中更大\n");return 0;
}
看结果
3.7strstr 的使⽤和模拟实现
1strstr的使用
char * strstr ( const char * str1, const char * str2);
函数返回字符串str2在字符串str1中第⼀次出现的位置
字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志
#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);printf("%s\n", str);return 0;
}
2strstr模拟实现
int main()
{char *p=strstr("abcdefg","cd");printf("%s", p);return 0;
}
//2模拟实现一下
char* My_strstr(const char* p1, const char* p2)
{const char* cur=p1;const char* p3=p2;while (*cur){cur = p1;p3 = p2;while ((*p3&&*cur)&&*cur++==*p3++)if (!*p3)return (char*)p1;if (*cur)p1++;elsereturn NULL;}return NULL;
}
看结果
总结
这几个字符串函数的模拟实现花了不少时间才手打完
ok祝大家开心