前言
本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看
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码值为0
return 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");
else
printf("第二个字符串的\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++;
}
else
break;
}
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");
else
printf("第二个字符串大\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");
else
printf("第二个字符串在前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++;
else
return NULL;
}
return NULL;
}
看结果
总结
这几个字符串函数的模拟实现花了不少时间才手打完
ok祝大家开心