本文重点介绍函数
引用头文件
函数名 | 函数功能 |
---|---|
iscntrl | 判断是否是控制字符 |
isspace | 判断是否是空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’ |
sdigit | 判断是否是十进制数字: 0~9 |
isxdigit | 判断是否是十六进制数字:包括所有十进制数字,小写字母 a ~ f,大写字母 A ~ F |
islower | 判断是否是小写字母:a ~ z |
isupper | 判断是否是大写字母 A ~ Z |
isalpha | 判断是否是字母:a ~ z 或 A ~ Z |
isalnum | 判断是否是字母或者数字:a ~ z,A ~ Z,0 ~ 9 |
ispunct | 判断是否是标点符号:任何不属于数字或者字母的图形字符(可打印) |
isgraph | 判断是否是任何图形字符 |
isprint | 判断是否是任何可打印字符,包括图形字符和空白字符 |
函数名 | 函数功能 |
---|---|
toupper | 将小写字母转换成大写字母 |
tolower | 将大写字母转换成小写字母 |
函数用例
int main()
{
char str[] = "i WANT TO PLAY bLACK mYTH wUKONG!";
for (int i = 0; i < strlen(str); i++)
{
if (islower(str[i]))
{
str[i] = toupper(str[i]);
}
else if (isupper(str[i]))
{
str[i] = tolower(str[i]);
}
}
printf("%s\n", str);
return 0;
}
字符串函数相关知识
求字符串长度
size_t strlen ( const char * str );
函数功能
函数参数
函数用例
拷贝字符串
char * strcpy ( char * destination, const char * source );
函数功能
函数参数
返回值
函数用例
连接字符串
char * strcat ( char * destination, const char * source );
函数功能
函数参数
返回值
函数用例
比较字符串
int strcmp ( const char * str1, const char * str2 );
函数功能
函数参数
函数用例
指定拷贝字符数
char * strncpy ( char * destination, const char * source, size_t num );
函数功能
函数参数
函数用例
指定连接字符数
char * strncat ( char * destination, const char * source, size_t num );
函数功能
函数用例
指定比较字符数
int strncmp ( const char * str1, const char * str2, size_t num );
函数功能
函数用例
找字符串子串
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
函数功能
函数参数
函数用例
分割字符串
char * strtok ( char * str, const char * delimiters );
函数功能
char str[] = "wwwoBlack_myth_wukong0com";
char* deli = "o_0";
- 按照 deli 提供的字符对 str 进行分割;
- 将 str 中 o_0 这几个字符的位置换成 \0,www\0Black_myth_wukong0com
- 然后返回分隔的位置之前的串的首地址
函数参数
返回值
注意事项
函数用例
错误报告函数
char * strerror ( int errnum );
函数功能
函数用例
实际使用
如果在可能发生错误的情况下需要先判断错误信息,这个时候时没有提供错误码的。
此时就需要将错误码先记录在 errno 变量里,直接将 errno 交给 strerror 即可,就不用每次手动输入错误码那么挫了。
errno:C 语言设置的一个存放错误码的全局变量。引用头文件:
1. 计数器法
size_t my_strlen(const char* str)
{
assert(str);
size_t len = 0;
while (*str++)
{
len++;
}
return len;
}
2. 递归法
size_t my_strlen(const char* str)
{
assert(str);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
3. 指针 - 指针法
size_t my_strlen(const char* str)
{
assert(str);
char* start = str;
char* end = start;
while (*++end != '\0');
return end - start;
}
char* my_strcpy(char* dest, const char* sour)
{
assert(dest && sour);
char* start = dest;; //源头的地址放到目标空间中会导致目标空间的地址被改变,先用 start 保留目标空间的地址
while (*dest++ = *sour++); //将 sour 指向的包含 '\0' 的字符串赋给 dest 指向的空间
return start; //返回目标空间的起始地址
}
char* my_strcat(char* dest, const char* sour)
{
assert(dest && sour);
char* start = dest; //记录目标空间的起始地址
while (*++dest); //找到目标空间的 '\0' 就停止
while (*dest++ = *sour++); //将 sour 指向的串连接过去
return start; //返回目标空间的起始地址
}
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2) //对应字符 ASCII 相等才会往后找不同
{
if ('\0' == *str1) //在对应字符相等的情况下,*st1 = '\0',说明 *str1 和 *str2 都等于 '\0'
{
return 0; //此时两个字符串完全相等
}
str1++;
str2++;
}
return *str1 - *str2; //返回对应字符 ASCII 码的差值
}
代码优化
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1++ == *str2++); //循环结束后 str1 和 str2 分别指向两个不想等字符的后一位
return *(str1 - 1) - *(str2 - 1); //重新指向两个不相等的字符然后解引用,用 ASCII 码值做差
}
char* my_strncpy(char* dest, const char* sour, size_t num)
{
assert(dest && sour);
int i = 0;
char* start = dest;
for (i = 0; i < num; i++)
{
*dest++ = *sour++;
}
return start;
}
char* my_strncat(char* dest, const char* sour, size_t num)
{
assert(dest && sour);
char* start = dest;
while (*++dest); //找到串 1 的 '\0' 的位置
for (int i = 0; i < num; i++)
{
if (!(*dest++ = *sour++)) //两个串任何一个遇到 '\0' 都直接结束函数调用
{
return start;
}
}
*dest = '\0'; //在末尾补上一个 '\0'
return start;
}
int my_strncmp(const char* str1, const char* str2, size_t num)
{
assert(str1 && str2);
while (*str1++ == *str2++ && --num); //比较到第 num 个字符循环 num - 1 次即可
return *(str1 - 1) - *(str2 - 1); //让两个指针重新指向不相等字符的位置
}
解题思路
结束条件
代码实现
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1; //记录str1位置
const char* s2 = str2; //记录str2位置
const char* p = str1; //记录起始位置
while (*p) //*p 指向 \0 时说明主串已经走到头了
{
s1 = p; //字符不相等时让 s1 指向 p 的位置
s2 = str2; //字符不相等时让 s2 回到 str2 的初始位置
while (*s1 && *s2 && *s1 == *s2) //字符相等且 s1,s2 都未指向 \0 时比较下一对字符
{
s1++;
s2++;
}
if ('\0' == *s2) //s2 走到 \0 时说明 str2 是 str1 的子串
{
return p; //返回在 str1 中首次出现 str2 的地址
}
p++; //不相等时让 s1 从 p 的下一个位置开始比较
}
return NULL; //都走到这步了说明 str2 肯定不是 str1 的子串
}