字符函数
1:字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
2:字符转换函数
c语言提供了两种字符转换函数
代码实现
//判断小写字母,然后转换成大写
int main()
{
char a[] = "abcdef\n";
int b = 0;
char c;
while (a[b])
{
c = a[b];
if (islower(c))
{
c = toupper(c);
}
putchar(c);//将字符标准输出
b++;
}
return 0;
}
字符串函数
strlen的模拟实现
int len(const char* str)
{
assert(str);
int a = 0;
while (*str)
{
a++;
str++;
}
return a;
}
int main()
{
char a[] = "123456";
int b=len(a);
printf("%d", b);
return 0;
}
这只是一种方式(计数器方式),还有另外两种方式,递归和指针-指针。
strcpy的模拟实现
str是将源空间的字符拷贝到目标空间中,以'\0'为结束标志。
- 源字符串必须以'\0'结束。
- 会将源字符串中的 '\0' 拷⻉到⽬标空间。
- ⽬标空间必须⾜够⼤,以确保能存放源字符串。
- ⽬标空间必须可变。
模拟实现
char stcp(char* a, const char* b)
{
char* c = a;
assert(a);
assert(b);
while (*a++ = *b++)
{
;
}
return c;
}
int main()
{
char a[] = "abcdef";
char b[] = "xxx";
stcp(a, b);
printf("%s",a);
return 0;
}
strcat模拟实现
- 源字符串必须以'\0' 结束。
- ⽬标字符串中也得有\0,否则没办法知道追加从哪⾥开始。
- ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
- ⽬标空间必须可修改。
- 字符串⾃⼰给⾃⼰追加,如何?
模拟实现
char stct(char* a, const char* b)
{
assert(a);
assert(b);
char* p = a;
char* i = b;
int aa = 0;
while (*a != '\0')
{
a++;
}
while (*b != '\0')
{
b++;
aa++;
}
while (aa--)
{
*a++ = *i++;
}
return p;
}
int main()
{
char a[20] = "abc";
char* b = "def";
stct(a, a);
printf("%s", a);
return 0;
}
strcmp 模拟实现
- 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数
- 第⼀个字符串等于第⼆个字符串,则返回0
- 第⼀个字符串等于第⼆个字符串,则返回0
- 那么如何判断两个字符串?⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩
模拟实现
int my_strcmp(const char* a, const char* b)
{
assert(a);
assert(b);
while (*a == *b)
{
if (*a == '\0')
return 0;
a++;
b++;
}
return *a - *b;
}
int main()
{
char a[] = "abc";
char b[] = "abc";
int c=my_strcmp(a, b);
printf("%d", c);
return 0;
}
strncpy模拟实现
- 拷⻉num个字符从源字符串到⽬标空间。
- 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
模拟实现
char* my_strncpy(char* a, const char* b, unsigned int c)
{
char* d = a;
assert(a);
assert(b);
while ((*a++ = *b++)&&c>0)
{
c--;
}
if (c > 0)
{
while (c--)
{
*a++ = '0';
}
}
else
*a = '\0';
return d;
}
int main()
{
char a[20] = "hello world";
char b[20] = "world";
my_strncpy(a, b, 8);
printf("%s", a);
}
strncat模拟实现
跟上面代码类似,模拟实现就是多了一个size_t参数,来表示追加几个字符。
模拟实现
char* my_strncat(char* a, const char* b, unsigned int c)
{
char* d = a;
assert(a);
assert(b);
while (*a)
{
a++;
}
while ( c > 0&& (*a++ = *b++))
{
c--;
}
if (c == 0)
{
*a++ = '\0';
}
return d;
}
int main()
{
char a[20] = "abc";
char b[] = "def";
my_strncat(a, b, 2);
printf("%s", a);
return 0;
}
strncmp模拟实现
- ⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。
模拟实现
int my_strncmp(const char* a, const char* b, size_t c)
{
while (c-- && *a == *b)
{
a++;
b++;
if (c == 0)
return 0;
}
return *a - *b;
}
int main()
{
char a[] = "abcde";
char b[] = "abced";
int c=my_strncmp(a, b, 5);
printf("%d", c);
return 0;
}
strstr模拟实现
在字符串中寻找子字符串,找到了就打印后续字符,直到‘\0’为止,没找到就返回空指针。
const char* my_strstr(const char* a, const char* b)
{
const char* c = a;
const char* d = b;
while (*a)
{
c = a;
d = b;
while (*c == *d&&*c&&*d)
{
c++;
d++;
}
if (*d == '\0')
{
return a;
}
a++;
}
}
int main()
{
char a[] = "abcdef";
char b[] = "cd";
char *c = my_strstr(a, b);
if (c != NULL)
printf("%s", c);
else
printf("找不到字符串");
return 0;
}
strtok函数使用
- strtok作为字符串分隔符使用,找到分隔符并用‘\0’结尾
- strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
int main()
{
char a[] = "123456,4,6,789";
char b[] = ",";
char* c;
for (c = strtok(a, b); c != NULL; c = strtok(NULL, b))
{
printf("%s\n", c);
}
return 0;
}
strerror函数使用
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
这里我准备打开一个str.txt的文件,但是我的目录里面并没有,就会报出错误信息
“没有这样的文件或目录 ”
int main()
{
char* b = fopen("str.txt", "r");
//printf("%s\n", strerror(errno));
perror("fopen");
return 0;
}
perror也用是打印错误信息