1.字符串的基本概念
字符串常量(用双引号括起来的)常量
汉字的编码方式
GB2312 GBK ----> 2个字节
UTF-8 ----> 3个字节
//定义了一个字符变量,存储了字符常量
char ch='a';
//定义了一个字符变量,但是存储了字符串常量(错)
char ch1 = "a";
printf("%c\n",ch1);
2.字符数组与字符串
字符数组,用来存储字符 也可以用来存储字符串
字符数组的定义的格式:一维: char 数组名[常量表达式];
char ch[2];
二维: char 数组名[常量表达式1][常量表达式2];
char str[5][20];
字符数组的初始化
1) 定义的同时进行初始化
//
// (1)完全
char str[4]={'a','b','c','d'};
char str2[]={'a','b','c','d'};
printf("\n");
//(2)部分
char str3[4]={'a'}; // a 0 0 0
char str4[4]={[3]='c'}; // 0 0 0 c
//2)先定义数组后初始化
char str5[4]; //没有初始化的时候,里面的内容是随机的
str5[3]='c'; //? ? ? c
//对字符数组进行遍历
for(int i=0;i<4;i++){
printf("*%d\t",str5[i]);
}
printf("\n");
//用字符数组保存字符串
char str6[10]={"hello"};
for(int i=0;i<10;i++){
printf("#%d\t",str6[i]);
}
printf("\n");
char str7[10]="hello"; // h e l l o \0 \0 \0 \0
//特别注意:
char str8[10];
//数组名是一个常量,常量的值是不允许修改的
//str8 = "hello"; //(错)
- 以字符串的形式输入和输出
字符数组
char str[5]={‘a’,’b’,’c’,’d’,’\0’};%c 逐个输出字符
%s 从指定的地址开始,依次输出字符,直到遇到 \0 结束了
//************** %s进行输出 **************
//%s格式进行输出
char str[]={'a','b','c','d','\0','e','f','\0'};
//指定的时数组的首地址
// printf("%s\n",str); //abcd
//%s输出字符串
char str2[]="abcdefg";
//printf("%s\n",str2); //abcdefgabcd
//************** %s进行输入 **************
// int num;
// scanf("%d",&num); //接收一个整数
// %c 接收一个字符
// scanf("%d,%c,%d",&a,&ch,&b);
// a = 45 ch = a b = 56
// %s 接收一个字符串
// 注意: 以%s进行输入的时候,字符串的中间不能有空格
// 以%s进行输入 遇到 空格 scanf 退出
char str5[10]; //9字符+\0
scanf("%s",str5); //从键盘接收字符串,保存到指定的地址处
printf("-----> %s \n",str5);
// int num;
// scanf("%d\n",&num); //不会报错,但不建议使用
// printf("%d",num);
- 字符串结束符的使用
//1.%s输出的时候,不使用\0会造成多输出很多东西(随机的)
//定义字符数组
char str[5]={'a','b','\0','d','e'};
// %s 从指定的地址开始,输出字符,直到遇到\0结束
printf("str = %s\n",str);
char str2[3]={'x','y','z'};
printf("str2 = %s\n",str2); //xyz ???
//2.不当的使用\0
char str3[]="abcdefa\0fsdasdf";
printf("str3 = %s\n",str3); //只输出abcdefa
//3.字符串的长度问题
char str4[10] ="hello";
printf("%lu\n",sizeof(str4)); //无法计算
printf("%lu\n",sizeof(str4)/sizeof(char)); //无法计算
- 字符串长度计算方法
//计算字符串的长度:
// 以 '\0' 作为结束条条件,做循环
// 如果我们取得的字符不是 '\0',让计数变量+1
//1.定义一个字符串
char str[5]="abc"; // a b c \0 \0
//2.定义一个变量保存字符的个数
int count = 1;
//3.循环变量i
// int i = 0;
//判断是否到了字符串的末尾
while(str[count-1]!='\0'){
//让计数变量+1
count++;
//循环变量累加
// i++;
}
printf("count = %d\n",count);
练习:判断字符串中是否包含某个字符,如果包含,返回其首次出现的位置,否则返回-1
//1.定义一个函数(参数:字符串 要查找的字符)
int keyIndexOfString(char str[],char key){
//2.循环,结束条件是 str[i]!='\0'
for (int i=0; str[i]!='\0'; i++) {
//3.判断,str[i]==key
//返回 i
if (str[i]==key) {
//字符出现的位置(下标)
return i;
}
}
//4.for循环执行结束后,返回-1
return -1;
3.字符串处理函数
常见的字符串处理函数:
1) puts 把字符串输出到控制台
char str[120]="cgx";
//使用%s不会换行
printf("I love %s",str);
//使用puts函数可以自动换行
//1)从指定地址开始,遇到\0结束
//2)不能进行格式化输出
puts(str);
puts("zbz");
2) gets 从键盘接收一个字符串,保存到字符数组中
从键盘接收一个字符串,保存到字符数组中
char str2[100];
//使用scanf接收键盘输入的字符串,中间不能有空格
//scanf("%s",str2);
//使用gets 会给出提示
//1)warning: this program uses gets(), which is unsafe.
//2)使用gets输入字符串的时候,字符串中间可以有空格
gets(str2);
puts(str2);
3) strcat 字符串的连接函数
//返回的是str的地址,保存到str数组中
char str[] = "abc";
char str2[] = "def";
strcat(str, str2);
//puts(str);
printf("连接后的字符串:%s",str); // abcdef
4) strcpy 字符串的拷贝函数
//strcpy(str1,str2);
//把str2的内容,拷贝到 str1中
//注意:
//1)str1中原来的内容被覆盖了
//2)str1的长度>=str2的长度,如果小于则越界了
char str[100]="cjk";
char str2[]="hello";
//拷贝
strcpy(str,str2);
puts(str); // hello
5)strcmp 字符串比较函数
//比较的原则上: 1)比较他们的ascii码值
// 2)比较字典中出现的顺序(越靠后,越大)
//strcmp(str1,str2); //返回的比较的结果
// >0 str1 > str2
// ==0 str1 == str2
// <0 str1 < str2
char s1[]="ad";
char s2[]="bd";
printf("%d\n",strcmp(s1, s2)); // -1
6) strlen 计算字符串的长度
// 返回的时可见的字符的个数
//int len = strlen(s1);
printf("%lu\n",strlen(s1));
char str3[]="我爱中国";
// 一个汉字默认是 utf-8 编码,占用3个字节
printf("%lu\n",strlen(str3)); //长度为12
练习:应用:单词首字母大写&统计单词个数
/*
使用gets()函数从键盘输入一个字符串,判断输入的有多少个单词?
*/
//1.定义数组
// 定义变量 (记录状态的变量,记录单词的个数)
char str[100];
int count = 0; //记录单词的个数
int isWord = 1;
//2.接收一个字符串
gets(str);
// 4
// abc hello ddd
//3.获取字符串的每个字符,如果遇到\0,就退出,否则循环
for (int i=0; str[i]!='\0'; i++) {
//4.判断是否是一个单词(如果出现了空格,而空格后面的字符友不是空格,这是一个单词)
if (str[i]==' ') {
isWord = 1; //表示这是一个单词的开始
//a 97
//A 65
//32
}else if (isWord==1){
str[i] = str[i]-32;
//5.如果是一个单词,我们最好用一个变量记录下
count++;
//设置不是一个单词
isWord = 0;
}
}
4.一级指针
- 变量的存取方式
int num = 10;
//使用变量名num获取num中存储的内容,直接存取
int sum = num+10; //10
// num -->0xff01
// 0xff01 --> 10 ,通过地址存取内存单元的值,间接存取
指针变量概念及定义方法
//指针变量
//指针: 地址
//指针变量:专门用来存放地址的变量//指针变量定义:
//格式: 数据类型 * 指针变量名;
// int num;
// int num; // int num; //int * num;//注意:
//1)指针变量只能用来存放地址
//2)* 表示这个变量是一个指针变量
//3)int 表示当前指针变量以后只能存放 int类型的变量的地址
//4)指针变量也区分全局的和局部的指针变量的初始化和引用
//指针变量的初始化
void test2(){
//定义普通的整型变量
int a=3,b=3;
int x=2,y;
double d1 = 3.14;
//指针变量的初始化
//1)定义的同时进行初始化
int *p = &a; //p指向了a
//2)先定义指针变量,然后再初始化
int *p1;
p1 = &b;
//3)可以用一个已经存在的指针变量初始化
int *p2 = p;
//4)给指针变量赋值 NULL
int *p3 = NULL; //表示 指针变量 p3指向内存中地址为0的地方
int *p4 = 0; //这是比较特殊
//5)指针变量可以被重新赋值(指向发生改变)
int *p5 = &x;
p2 = p5; //指针的指向可以发生改变
int *p6; //p6 存放的时垃圾值
}
int main(int argc, const char * argv[]) {
//定义普通的整型变量
int a=3,b=3;
//指针变量的初始化
//1)定义的同时进行初始化
int *p = &a; //p指向了a
printf("ssssssa = %ld\n",sizeof(p));
//直接访问
printf("a = %d\n",a); //3
//使用* 获取指针变量指向的内存空间的内容
printf("*p = %d\n",*p); //3
//使用* 设置指针变量指向的内存空间的内容
*p = 100;
printf("*p = %d\n",*p); //100
//注意: * 使用场合有两个
//1) 用在定义变量的时候,表示 定义的时一个指针变量
//2) *指针变量名 表示,获取指针变量指向的内存空间的内容