c语言的字符函数放在文件ctype.h,要使用自带的字符函数必须加上头文件#include"string.h",自带的字符函数主要用于字符类别的判断及转换。
自带的字符函数包括了字符函数和字符串处理(字符数组)函数,字符函数前者是对单个字符进行操作,后者是对一维或二维字符数组进行操作。
1.字符函数
ex:(这里的字符a为单个的字符'a')
(1)isalnum(a):判断字符a是否为字母或者数字,若a位字母或者数字,则返回非0值,反之return 0,下面的同理。
(2)islower(a):判断字符a是否为小写字母。
(3)tolower(a):将字符a由大写字母转换为小写字母。
2.字符数组函数(字符串的引用)
备注:字符串引用有两种方式,一种是通过字符数组名,另外一种是利用字符指针变量。前者是初始化字符数组后通过字符数组名或者字符数组中的某个元素引用。后者是对字符指针赋值或者初始化后利用指针名进行引用(只能引用不能修改值)。
(1)字符数组名引用
1.字符数组初始化
(1)char a[3]={'a','b'};//单个字符初始化
(2)char a[3]="ab";//字符串初始化
(3)不设定字符数组具体大小
char a[]={'a','b'};
char a[]="ab";
2.字符数组名的引用方式
include"stdio.h"
int main(){
char a[]="abc d";//不设定字符数组具体大小的字符数组为例return 0;
}
(1)数组名的引用
printf("%s\n",a);//打印数组a,这里的字符数组是个字符串所以用%s
(2)字符数组的某个具体字符的引用
printf("%c\n",a[1]);//打印字符串(字符数组)的第2个元素,这里的例子是打印b
(2)字符指针变量引用方式
1.两种利用指针的方式表示字符数组(字符串)
这里的赋值和初始化并不表示将整个字符串存入字符指针变量中,字符指针变量是个指针,只能存储字符的地址值。下面的代码的实质含义是:首先将字符串常量存入内存的空闲区域中,然后再将该字符串中的首字符的地址赋给字符变量p,可以通过间接引用这个字符串中的某个字符。
(1)字符指针初始化
char *p;
p="ab cd";
(2)字符指针赋值:
char *p="ab cd";
2.字符指针间接引用
#include"stdio.h"
int main(){
char *p="ab cd";//以字符指针赋值方式为例return 0;
}
(1)指针名间接引用
printf("%s\n",p);//p是个字符串所以用%s
(2)指针性质表示单个字符
printf("%c\n",*(p+1));//打印字符指针数组(字符串)中的第2个元素,这里打印的也是b
3.常用的字符数组(字符串处理)函数
备注(相关名词解释):
- 字符常量:用单引号括起来的一个字符,如'a'、'A'、'1'、'='。
-
字符串常量:是指在程序中用双引号括起来的字符序列,例如:“hello world”。它是一个常量,表示一个不可修改的字符串。
-
字符数组名:是指用来存储字符序列的数组的名称。它可以用来访问和修改数组中的元素,由上面提到的三种表示方式都可以表示,例如:char str[10] = “hello”; 中的 str 就是字符数组名。
-
字符指针变量:是指一个指向字符类型的指针变量。它可以指向一个字符,也可以指向一个字符串常量或字符数组名。例如:char *ptr = “hello”; 中的 ptr 就是一个字符指针变量。
-
字符指针表达式:是指使用指针操作符对字符指针进行操作的表达式。例如:*(ptr + i) 就是一个字符指针表达式,表示指针 ptr 加上偏移量 i 后的值。
(1)puts(字符串引用):
和printf()函数表示的含义一样,都是输出,但是比printf更简洁,而且不用写\n就能自动换行,也不用写%啥的那些。这里括号内的字符串引用可以是字符串常量,字符数组名或字符指针变量或者字符指针表达式。
作用:将一个字符串(以′\0′结束的字符序列)输出到终端。 用puts函数输出的字符串中可以包含转义字符。 在用puts输出时将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行。
#include"stdio.h"
int main(){
char a[10]="abc";
char *p="dfd";
puts("hhh");//字符串常量
puts(a);//字符数组名
puts(p);//字符指针变量名
//puts(*(p+1));//字符指针表达式
return 0;
}
上面的代码中 puts(*(p+1));//字符指针表达式,是错的,应改为printf(“%d”, (ptr + 1));就可以正常工作是因为它使用了指针算术运算。在这里,ptr指向一个整数数组的第一个元素,并且通过在ptr上加1,我们将指针移动到了下一个整数元素的位置。然后,(ptr + 1)会取得这个新位置上的值。而puts函数是用于输出字符串的,它期望传入一个以空字符结尾的字符数组或指针。当你尝试使用*(ptr + i)作为参数传递给puts时,它会尝试将以*(ptr + i)为起始地址的字符串输出,但是这个地址很可能是无效的。因为指针算术运算只能用于连续内存块中的元素,而不适用于随机分布的元素。
不能使用字符指针表达式作为put的参数用puts()和gets()输入输出,printf和scanf可以。
(2)gets(字符数组名)
类似scanf(),用来输入的,作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址,允许输入的字符串中包含空格。
(3)strlen(字符串引用):
字符串长度函数,用来求字符串的长度的,注意这里的长度是有效长度,就是不包括'\0'的字符的个数,与sizeof()相区别,sizeof也是求字符串长度的但是它是包括'\0'的,但是你如果是定义的字符串“字符(空格)串”里面的空格还是算的。(如下代码和运行图)
#include"stdio.h"
#include"string.h"
int main(){
char a[10]="abcd ef";
printf("%d\n",sizeof(a));
printf("%d\n",strlen(a));
printf("%d\n",strlen("abcrfuq\0"));
printf("%d\n",strlen("abc rfuq\0"));
return 0;
}
(4)strcpy(字符数组名, 字符串引用)
这个是字符串复制函数,常用于字符数组合并,表示把b连接到a后面。括号中的“字符串引用”可以是字符串常量(ex:“abc”)、字符数组名、字符指针变量(p)或者字符指针表达式。
#include"stdio.h"
#include"string.h"
int main(){
char a[]="abc",b[]="def";
strcat(a,b);
puts(a);
return 0;
}
(5)strcmp(字符串引用1, 字符串引用2)
strcmp(str1, str2);//字符数组名
strcmp("China", "Korea");//字符串常量
strcmp(str1, "Beijing");//字符数组名和字符串常量
作用:比较字符串1和字符串2。
比较的规则: 分别从它们的首字符开始,将对应的字符按照对应的ASCII码值进行比较,直到发现对应的两个字符的不同或者出现\0为止。
(1)如全部字符相同,则认为两个字符串相等。
(2)若出现不相同的字符,则以第1对不相同的字符的比较结果为准。
比较的结果将由函数值带回:
(1) 如果字符串1=字符串2,则函数值为0。
(2) 如果字符串1>字符串2,则函数值为一个正整数。
(3) 如果字符串1<字符串2,则函数值为一个负整数。
所以,对于两个字符串比较元素是否相同,不能直接用str1>str2进行,因为str1和str2代表地址而不代表数组中全部元素,而只能用 (strcmp(str1,str2)>0)然后循环实现,系统分别找到两个字符数组的第一个元素,然后顺序比较数组中各个元素的值。如果不是一个个比较也可以直接像下面这个代码一样直接输出一个正/负数/0表示是否相等。
#include"stdio.h"
#include"string.h"
int main(){
char a[]="abc",b[]="cdf";
printf("%d\n",strcmp(a,b));
return 0;
}