目录
- 一.一个参数的字符函数
-
- 1.字符分类函数
- 2.字符转换函数
- 二.两个参数 长度不受限的字符串函数
-
- 1.strcpy函数
- 2.strcat函数
- 3.strcmp函数
- 三.三个参数 长度受限的字符串函数
-
- 1.strncpy函数
- 2.strncat函数
- 3.strncmp函数
- 四.其他字符串函数
-
- 1.strstr函数
- 2.strlen函数
- 3.strtok函数
- 4.strerror函数
一.一个参数的字符函数
1.字符分类函数
用于判断字符的类型,专门用于字符分类。 需包含头文件 ctpye.h 例如: isalpha:判断参数是否是字母 isdigit :判断参数是否是数字
符合条件返回真,不符合返回假。
2.字符转换函数
int tolower(int c);//将参数从大写转为小写
int touppper(int c);//将参数从小写转为大写
用于转换大小写。
二.两个参数 长度不受限的字符串函数
1.strcpy函数
char* strcpy(char* destination,const char* source);
char arr1[] = "abc";
char arr2[10] = {0};
strcpy(arr2,arr1);
strcpy用于拷贝字符串,将 arr1(source) 的字符串拷入 arr2(destination)。
注意: 源字符串必须以 ‘\\0’ 结尾。 会将源字符串的 ‘\\0’ 拷入目标空间。 目标空间必须足够大 确保能放入拷贝的字符串。 目标空间必须可修改。
const char* destination;//error 目标空间此时不能修改
char* p = "abcd";//error 常量字符串不能被修改 p为指针 指向首字符的地址
char* p[10] = "abcd";//此时 p为数组名 数组中存放字符串 可修改
模拟实现:
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//确保两个指针非空
char* res = dest;
while(*dest++ = *src++)//后++先用再加
{ //通过赋值拷贝数据 将'\\0'赋值给dest后表达式为 0,while终止循环
;//空语句
}
return res;//返回目标空间的起始地址
}
2.strcat函数
和strcpy函数很像,strcpy从开头覆盖到’\\0’结束,strcat从结尾’\\0’开始覆盖 直到整个源字符串追加完成。 strcpy 是替换,strcat 是追加。
注意: 源字符串必须以 ‘\\0’ 结尾。 从目标字符串的 ‘\\0’ 开始追加 ‘\\0’被覆盖,将源字符串整体拷入包括’\\0’。 目标空间必须足够大 确保能放入源字符串。 目标空间必须可修改。
模拟实现:
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);//确保两个指针非空
char* res = dest;
while(*dest)//找到'\\0' 不用再加了
{
dest++;
}
while(*dest++ = *src++)//dest从'\\0'开始 通过赋值拷贝数据
{
;//空语句
}
return res;//返回目标空间的起始地址
}
strcat函数的模拟实现 相比 strcpy 只多了一个找’\\0’的while循环。
3.strcmp函数
用于比较两个字符的大小。
int strcmp(const char* str1, const char* str2);
int res = strcmp("abc","abcd");//<0
从左到右比较字符的ASCII码大小, 字符相同则比较下一个字符,直到得出结果,ASCII码值小 则小,返回值小于0,ASCII码值大,返回值大于0。如果完全相同返回 0。'\\0’也参与比较 其ASCII码值为 0。
if("abc" < "abcd")//error
…
直接让两个字符比较,比较的是两个字符串首字符的地址 而不是字符串的内容。
模拟实现:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while(*str1 == *str2)
{
if(*str1 == '\\0')//两个字符串均为'\\0'
return 0;//相等
str1++;
str2++;
}
return *str1 – *str2;//如果str1>str2 返回值>0
//如果str1<str2 返回值<0
}
三.三个参数 长度受限的字符串函数
1.strncpy函数
char arr1[] = "abc";
char arr2[10] = "xxxxxxx";
//strcpy(arr2,arr1);abc\\0xxx
//strncpy(arr2,arr1,3);abcxxxx (只覆盖前3位 没有'\\0')
strncpy(arr2,arr1,5);//abc\\0\\0xx (位数不够补'\\0')
可以自行决定拷贝的个数。
2.strncat函数
char arr1[] = "abc";
char arr2[10] = "qq\\0xxxxxxx";
strncat(arr2,arr1,2);//qqab\\0xxxxxxx
可以自行决定追加的个数。覆盖’\\0’,追加完成后再加回一个’\\0’。
3.strncmp函数
char str1[] = "abc";
char str2[] = "abe";
strncmp(str1, str2, 2);//0 相等
可以自行决定比较的字符数。
四.其他字符串函数
1.strstr函数
string string 在字符串中找字符串(子字符串)。
char* strstr(const char* str1, const char* str2);
在str1中找str2是否存在,如果存在 返回str1中 str2首字符出现的地址,找不到则返回NULL。
模拟实现:
const char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = NULL;
const char* s2 = NULL;
const char* cur = str1;
while(*cur)
{
s1 = cur;
s2 = str2;
while(*s1 == *s2 && *s1!='\\0' && *s2!='\\0')//找到字符 且未结束
{
s1++;
s2++;
}
if(*s2 == '\\0')//str2已被找到
return cur;//返回起始地址
cur++;//如果 *s1=='\\0'大循环结束,*s2=='\\0' 已找到
//*s1!=*s2 未找到,cur+1 继续找 直到找到或者找不到
}
}
2.strlen函数
size_t strlen(const char*str);
用于获取字符串的长度。 检测 ‘\\0’ 前的字符个数。 注意: 参数指向的字符串必须包含 ‘\\0’ 。 需包含头文件 <string.h> 。 返回值类型为 size_t (无符号)。
if (strlen("ab") – strlen("abcd") > 0)
printf("1");
else
printf("0");
表面看 2 – 4 = -2,打印结果应为 0,但实际打印结果为 1。因为该函数的返回值类型为 size_t 无符号,-2的补码会被当做一个非常大的正数输出,因此打印 1。
3.strtok函数
char* strtok(char*str, const char* sep);
因为字符串内容会被strtok函数改变,字符串一般都是副本 且可以修改。
char str[] = "abc@cde.qwe";
char temp[20] = {0};
strcpy(temp, str);
sep指向一个字符串,这个字符串是分割符(字符)的集合。 str指向的字符串 包含sep指向的字符串中的分隔符,这个分隔符记为标记。
const char* sep = "@.";//两个分隔符(标记)'@' 和 '.'
strtok函数会找到这个标记,将其变为’\\0’,并返回指向这个标记的指针。
char* p = strtok(temp, sep);//返回第一个标记的地址 赋给p
p = strtok(NULL,sep);//查找下一个标记
如果 str != NULL ,函数将找到字符串的第一个标记,并保存它的位置(地址)。 如果 str == NULL,函数将从被保存的位置开始,查找下一个标记。 如果标记被找完,返回NULL。
也可以如下编写程序:
char* p = NULL;//定义一个指针并置于NULL 防止野指针出现
for(p = strtok(temp, sep); p!=NULL; p = strtok(NULL, sep))
{
printf("%s ",p);//打印结果
}
//"abc\\0cde\\0qwe"
strtok函数从被保存位置开始找下一个标记,运用了static。
4.strerror函数
在C语言中,库函数调用失败会记录错误码,错误码存放在全局变量errno中。 在头文件 errno.h 中有说明。
char* strerror(int errnum);
函数可以把参数部分错误码 对应的字符串信息的地址返回来。 每一个数字(错误码)对应了一条错误信息,这个信息也是字符串,具有地址。
没有错误时 errno为 0,有错误时 errno存放错误相关的错误码, 使用strerror函数将具体的错误信息地址带回 用printf函数打印展现。
char* p = strerror(1);
printf("%s", p);
perror("hello");// hello: …(错误信息)
perror 相当于 printf + strerror,自定义信息:xxxxx(错误信息)。
网硕互联帮助中心




评论前必须登录!
注册