字符和字符串的应用

1.字符类型

字符常量用单引号括起来 如 char ch='A';
用双引号括起来的是字符串

①字符操作

字符常量事实上是int而不是char
计算中出现字符或者是存储字符时C语音只是运用到了其代表的整数值(ASCII表)

②符号字符和无符号字符

一个char大小为1字节 8bit(一个int为4字节 32bit)
unsigned char 0-255
signed char -128~127

③字符处理函数

升大写函数 toupper

//toupper函数:converts ch to upper case 否则返回本身
ch = toupper(ch);

④scanf和printf读写字符

%c用于scanf()和printf()来进行读写操作
貌似其实没有什么值得特别说明的
注意一下scanf()读写空白字符的注意事项即可
若想在scanf()在读入下一个字符时强制跳过键盘输入的空白字符 则要在scanf()函数的格式串中添加一个或多个空白字符

scanf("%c",&c);
printf("%c",&c);

⑤getchar和putchar读写字符

gets()和puts()函数是用来处理字符串的函数
getchar和putchar是用来处理字符的函数

//getchar函数
char c;
c=getchar('a');//getchar的字符要写上''单引号
//getchar函数读入参数位置的字符并返回,从而赋值给变量c
//注意getchar的返回值是一个int而不是char 在这里进行了自动类型的转换。若c的类型是int,则c存储的是相应的整数。
//所以getchar putchar本质是运用了字符ASCII码来读入读出字符 不能用来处理字符串 只能用来处理单个字符(通常来说,可以用来处理所有在ACSII码表上存在的字符,包括各种空白字符入换行符和转义字符)

//putchar函数
char c = 56putchar(c);
putchar(56);
//putchar()函数参数类型为一个char或者int(因为字符本质在计算机中就是以整数来进行存储的),输出对应的char类型字符

字符串类型

1.字符串字面量

字符串字面量和字符常量:字符串字面量和字符常量代表的东西不同。字符串字面量本质是数组,表示的是一个指针指向系统中的一片区域,该区域存储着该字符串。字符常量本质是int,也存储在系统的一片区域。字符串字面量和字符常量都是常量,可以进行赋值,但不能被更改
字符串字面量支持下标 char c = “abc”[0];
注:char c[]="XXX"合法 但是 char c[10];c=“XXX”;不合法
在字符数组的定义中=等于号不是赋值运算符
数组名不可出现在赋值运算符的左边(不可作为赋值运算符的左值)

//字符串字面量是系统自带的 如
char a[10] = "Hello World!";
//"Hello World"字符串不被我们所定义,而是系统本来就自己定义好的,称为字符串字面量
//对于字符串自变量由于不是我们自己所定义的,我们对其只有访问权而不能进行修改(如用指针对其进行修改)

//若用指针指向一个字符串字面量
char* c = "Hello world";
//其实这句语句是const char *c = "Hello World";
//指针指向的对象不可进行修改

因为定义一个指向字符串常量的指针实际上是一个const char*
所以不推荐使用char* c =“XXXXXx” 的写法
而是将字符串字面量赋值给一个新定义的字符数组
从而可对该字符串进行访问和修改

2.对字符串字面量进行储存–字符数组和字符指针

定义方式:一共四种(字符数组的定义和指针的定义)
char 字符串名称[字符串长度] = {‘字符串所含元素’};
char 字符串名称[字符串长度] =“字面量字符串”;
char 字符串名称[] = {‘字符串所含元素’};
char string = {“字符串所含元素”}(注意必须先要申请一块内存空间 或者用charstring指向已定义的字符数组。否则将指向字符串字面量,引起错误)
若在定义时给定了字符串长度,若strlen+1长于字符串则在空缺地方填补空字符/0,否则超出strlen+1部分会被舍弃(被编译器忽略)

//定义方式
char date1[8] = "June 14";
//char date1[]={'J','u','n','e',' ','1','4'};
//char date1[100]={'J','u','n','e',' ','1','4'};
/* char*string = (char*)malloc((strlen+1)*sizeof(char));
string = {数组三种定义方式}*/

3.字符串的读和写

printf() puts()来进行字符串的写
scanf() gets()来进行字符串的读
%s用于printf() scanf()函数的转换说明

/*printf函数逐个写字符串的字符,直到遇到/0
可用%.ns来只显示字符串的一部分(若遇到/0会提前终止) p是要显示的字符数量
%ms会在大小为m的字段内显示字符串*/
printf("%.6\n",str);
//由于/0是字符串结束的标志所以puts也会在此时停止 会多输出一个/n
puts(str);
//scanf不需要在str前加&,因为数组名可当作是指针
//当读入到字符数组 scanf会跳过开始的空白字符并在最后遇到空白字符终止,在末尾添加一个/0-->用scanf读入的字符串永远不会包含空白字符(注意用scanf读入字符时可以读入空白字符 但因为读入字符串时读空白字符会作为空字符所以才会读不进去)
//scanf("%ns",str) n表示最多可以存储的字符数
scanf("%s",str);
//为了避免scanf读到的字符串不会包含空白字符,则可用gets
//gets不会跳过开头的空白字符
//gets以换行符/n为停止标志,而scanf以任意空白字符为停止标志

4.通过下标来访问字符串

我们可以用getchar()自定义一个函数来读入字符串

str[i++]=getchar();
//通过下标对字符串进行遍历
for(i=0;s[i]!='\0';i++){
}

5.C语言的字符串库

#include <string.h>字符串头文件

strcpy()复制函数

//strcpy()函数 复制字符串
//函数原型 char*strcpy(char*s1,char*s2);
//把s2中的字符复制到s1中直到遇到s2的第一个空字符,返回s1.该过程不会改变s2('\0'也会被复制)
//str2=str1 WRONG  数组名不能出现在赋值运算符左边
strcpy(str2,str1);//后复制给前
strcpy(str2,str1,sizeof(str2)) //第三个参数限制复制的字符数(包括空字符) 
//strncpy()有三个参数 限制复制字符数
strncpy(str2,str1,sizeof(str2)-1);
str2[sizeof(str2)-1]='\0';//保证str2最后一个字符是空字符

strlen()求长度函数

//strlen函数 求字符串长度函数(该长度不包括空字符 所以字符数组的长度为strlen+1)
//函数原型 size_t strlen(const char*s);
//size_t是一个typedef把其当成是int
int len;
len = strlen("abc"); //len=3而不是4
//strlen不会测量字符数组本身的长度,而是测量字符串的长度

strcat()拼接函数

//strcat()函数  拼接两个字符串
//函数原型 char*strcat(char*s1,const char*s2);
//把字符串s2的内容追加到字符串s1的末尾(会先把s1末尾的\0覆盖),并且返回字符串s1(返回指针)
strcat(str1,"abc");
strcat(str2,"efg");
strcat(str1,strcpy(str2,"hij");
//strncat(char*s1,const char*s2,int n)有三个参数 限制拼接的字符数(\0不计算在字符数内)
strncat(char*s1,const char*s2,sizeof(str1)-strlen(str)-1);
//strcat在遇到s2空字符时结束拼接

strcmp()比较函数
返回值:
返回0 s1=s2
返回正数 s1>s2
返回负数 s1<s2

//int strcmp(const char* s1,const char* s2);返回一个大于、等于、小于0的数
//因为数组名不能出现在出现在==的两边 s1==s2 不成立 所以要用strcmp进行比较
if(strcmp(s1,s2)<0) {}
/*s1<s2
1、s1与s2前i个字符一致,但是s1第i+1个字符小于s2的第i+1个字符
2、s1所有字符与s2一致但比s2短
大写字母小于小写字母
数字小于字母
空格符小于所有打印字符*/

6.字符串数组(二维字符数组)

一维字符数组表示字符串
二维字符数组表示字符串数组(没有元素的位置补空字符)
定义方式

char c[][8]={"XXXX","XXXX","XXXX"};
char c[4][8]={"XXXX","XXXX","XXXX"};
char*c=c[0]其中c是一个已经定义好的数组(列指针)
char(*c)[4]=c其中c是一个已经定义好的二维数组(行指针)
**注:二维数组c的数组名实际上是一个指向数组的指针**

在这里我们可以对二维数组的存储方式做一个新的改变
char* c[] = string_array其中string_array是一个已经被定义好的二维数组;c是一个指针数组(c是一个数组,该数组存放的是指向字符数组的指针)
实际上二维数组也可以用此方法进行定义
int*c[3]=一个已经被定义好的二维数组;//c是一个数组,该数组存放的是指向int数组的指针
在这种新的存储方式下 我们仍然是用char[][]双下标来对改存储模式进行访问

char *planets[]={"Hello","HI","Are you there?"};
/*
planets在这里是一个数组名
等价于 char*(*pointer)[]=XXXXXx
pointer是一个指针,指向char*[]字符指针数组
字符指针数组里面又字符指针指向字符串的首个字符
所以这些字符指针数组里面的字符指针可以用来表示和凡哥维纳字符串
*/

这种新的存储方式运用到了指针,更方便多个字符串(多个数组)的处理,比如说我们要通过二维字符数组输出多个字符串时,我们能交换第一第二行字符串的顺序,从而改变输出的字符串的顺序(比如说用strcmp实现字符串从小到大进行输出,来进行字符串的sort算法)

//下面程序完成对一批语言名(字符串)从小到大的进行排序并输出
#include<stdio.h>
#include<string.h>
//由于字符名都是字符串,所以我们用二维指针字符数组来对这一批字符串进行处理
sort(char*p[],int num){
	int i,j;
	char*tmp;//tmp为临时指针 对字符串的顺序进行处理
	for(j=1;j<=num-1;j++){//用冒泡排序迭代 进行num-1次冒泡
		for(i=0;i<num-1-j;i++){
			//每一轮排序共进行冒泡次数-j次比较
			if(strcmp(p[i],p[i+1])>0){
				tmp=p[i];
				p[i+1]=p[i];
				p[i+1]=tmp;
			}
		}
	}
}
void main(){
	int i;
	char*book[]={"FORASD","XXXXXx"}//要用指针数组的形式来构造二维数组
	sort(book,2);//对字符串的顺序进行排序
	for(i=0;i<6;i++){
	printf("%s\n",book[i];
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值