在c当中有一种数组是由char类型构成的,其中的元素都是字符,如果这个字符数组是以字符编码0('0'字符)结尾的,那么我们就叫这个字符数组为字符串
字符串的数据常量形式是使用双引号包围的字符序列
1 字符串的声明和初始化
我们可以声明一个字符数组,然后用一个字符串赋值
char str[10] = "hello";
这里表示在内存当中开辟一块空间,大小是10个char类型的长度,同时依次的在空间当中存入字符数据,最终结束的时候添加0
这里需要注意的是,如果字符串的声明和赋值不在一条语句当中,那么就不能使用字符串常量的赋值方式,而是需要逐个字符依次赋值
#include<stdio.h>
int main(){
char str[10];
str = "hello";
return 0;
}
这个程序会出错
正确的方式是
#include<stdio.h>
int main(){
char str[10],str1[]="hello";
int i=0;
while(str1[i]!='0'){
str[i]=str1[i];
i++;
}
str[i]='0';
printf("%s",str);
return 0;
}
但是过于繁琐,所以我们一般都是直接在声明字符串的时候赋值
#include<stdio.h>
int main(){
char str[10]="hello";
printf("%s",str);
return 0;
}
在声明字符串的时候,如果同时进行了初始化,那么可以省略字符串数组的长度,会自动计算
#include<stdio.h>
int main(){
char str[]="hello";
printf("%s",str);
return 0;
}
这里需要注意的是字符数组的长度和其所保存的字符串的长度是不一致的
字符串的长度是字符串当中的字符个数,而字符数组长度是在内存当中准备的保存字符串的空间大小,一般字符数组的长度要大于字符串的长度
#include<stdio.h>
#include<string.h>
int main(){
char str[10]="hello";
printf("字符数组的长度%dn",sizeof str/sizeof(char));
printf("字符串的长度%d",strlen(str));
return 0;
}
这里使用了一个新的库函数strlen(),用来获取字符串的长度
输入和输出字符串的时候需要使用%s作为占位符
2 转义字符
每一个字符都会对应着一个数字,我们称之为字符编码,字符编码的集合就叫做字符集,我们在使用字符的时候可以直接使用字符的实体,也可以使用转义字符,转义字符使用开头加上一个八进制或者16进制的整数
比如说,a的ascii字符集是97,那么我们输出a的时候可以直接使用字符'a',也可以使用97的8进制
141,也可以使用16进制61
8进制直接写数字就可以,16进制在数字之前加上x
#include <stdio.h>
#include <string.h>
int main(){
char c1 ='a';
char c2 ='141';
char c3 = 'x61';
printf("%c,%c,%c",c1,c2,c3);
}
在字符串当中也可以使用转义字符,比如说
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "15014515415415740x77x6fx72x6cx64";
printf("%s",str);
return 0;
}
这里利用转义字符输出了hello world
对于可见的字符我们通常不会使用字符编码,而是直接使用字符实体,通常转义字符都是用来输出不可见的控制字符,比如说换行符,回车符,制表符,
但是去记忆不可见字符的字符编码通常会比较困难,所以常见的不可见的控制字符都会有一个简写形式
比如常用的换行符
#include <stdio.h>
#include <string.h>
int main(){
char str[] = "hellonworld";
printf("%s",str);
return 0;
}
3 字符串处理函数
c语言当中自带了一系列的字符串处理函数,比如之前使用过的strlen(),要使用这些函数需要引入string.h头文件
标准库头文件 <cstring>zh.cppreference.com这里介绍几个比较常用的字符串处理函数
strcopy()
strcopy(字符串1,字符串2),把字符串2复制到字符串1当中
#include<stdio.h>
#include<string.h>
int main(){
char str1[10],str2[]="hello";
strcpy(str1,str2);
printf("%s",str1);
return 0;
}
strcat()
strcat(字符串1,字符串2),把字符串2连接到字符串的末尾
#include<stdio.h>
#include<string.h>
int main(){
char str1[]="hello";
char str2[]="world";
strcat(str1,str2);
printf("%s",str1);
return 0;
}
strlen()
strlen(字符串),返回字符串的长度
#include<stdio.h>
#include<string.h>
int main(){
char str1[]="hello";
printf("字符串长度是%d",strlen(str1));
return 0;
}
这里说的字符串长度是指在字符数组当中,从第一个字符到'0'之前的字符数量,不包括('0')
strcmp()
strcmp(字符串1,字符串2),比较字符串的大小
字符串大小的比较规则是:以各个字符对应的 ASCII 码值进行比较
strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
如果字符串1和字符串2相同,就返回0;
如果字符串1大于字符串2,就返回返回大于 0 的值;
如果字符串1小于字符串2,就返回返回小于 0 的值;
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "aBcDeF";
char b[] = "AbCdEf";
char c[] = "aacdef";
char d[] = "aBcDeF";
printf("a和b的比较结果: %dn", strcmp(a, b));
printf("a和c的比较结果: %dn", strcmp(a, c));
printf("a和d的比较结果: %dn", strcmp(a, d));
return 0;
}