C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h
以上函数可见 --> 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;
}
#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 = toupper(c);
putchar(c);
i++;
}
return 0;
}
我们已经学会了strlen的使用,但其原理如何却不知道,那么能不能模拟实现strlen呢?
方法1 采用计数器的方式,每次得到一个字符,count++,同时让str往后走。
方法2:递归方式
方法3
• 源字符串必须以 ‘\0’ 结束。 • 会将源字符串中的 ‘\0’ 拷贝到目标空间。 • 目标空间必须足够大,以确保能存放源字符串。 • 目标空间必须可修改。
#include<stdio.h>
int main()
{
char arr1[10]={0};
char arr2[10]="abcdef";
strcpy(arr1,arr2);
printf("%s",arr1);
}
明白了strcpy的使用后,我们是否可以自己实现strcpy完成字符串的拷贝呢?
char* my_strcpy(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))
{
;
}
return ret;
}
这个函数的使用又和strcpy有什么样的联系或区别呢?
第一次接触这个函数可能并不明白这啥意思,如果我们将它与strcpy一起对比。
两个函数都是将source中的字符拷贝到destination这个目标空间,唯独不同的是strncpy可以指定拷贝多少数据
strncpy规则: • 拷贝num个字符从源字符串到目标空间。 • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
• 源字符串必须以 ‘\0’ 结束。 • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。 • 目标空间必须有足够的大,能容纳下源字符串的内容。 • 目标空间必须可修改。
int main()
{
char arr1[100] = "abcde\0fhij";
char arr2[] = "xxxxxx";
strcat(arr1, arr2);//strcat在\0后面追加字母
printf("%s", arr1);
return 0;
}
我们是否可以让字符串自己给自己追加呢?
根据strcat的规则: 1. 目标字符串先需要走到\0的地方 2. 接着将源字符串拷贝到目标字符串
char *my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
{
dest++;
}
while((*dest++ = *src++))
{
;
}
return ret;
}
有了前面的strncpy,我们不难猜测,strncat能够限制追加多少个字符,事实上就是这样。
#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;
}
我们前面在qsort函数章节中比较字符串大小时就使用strcmp函数,但是并不知道它的含义及如何使用、模拟实现。
◦ 第⼀个字符串大于第二个字符串,则返回大于0的数字 ◦ 第⼀个字符串等于第二个字符串,则返回0 ◦ 第⼀个字符串小于第二个字符串,则返回小于0的数字 ◦ 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。
int my_strcmp (const char * str1, const char * str2)
{
int ret = 0 ;
assert(str1 != NULL);
assert(str2 != NULL);
while(*str1 == *str2)
{
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
仿照前面的strncpy和strncat函数,strncmp即限定比较多少个字符。