AIOps 一场颠覆传统运维的盛筵
942
2023-01-02
C语言_二维数组与一维指针
知识点1:字符串
字符串:本身属于字符数组、字符串结尾有’\0’。
1.1字符串作业
1.从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数
2.字符串比较:从键盘上录入2个字符串,判断是否相等。
3.字符串删除:从键盘上录入一个字符串,删除字符串里指定的单词,输出结果。
比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
删除单词:“123”
输出的结果:”akjbcdsdfjvbffdvbfd”
#include #include int main() { char str1[100]; char str2[100]; int i=0,j=0; int str2_len=0; /*1. 录入数据*/ printf("输入源字符串:"); scanf("%s",str1); printf("输入要删除的字符串:"); scanf("%s",str2); /*2. 计算要删除字符串的长度*/ str2_len=strlen(str2); /*3. 查找字符串*/ for(i=0;str1[i]!='\0';i++) { //比较字符串 for(j=0;str2[j]!='\0';j++) { if(str1[i+j]!=str2[j])break; } if(str2[j]=='\0') { //4. 删除字符串---后面向前面覆盖 for(j=i;str1[j]!='\0';j++) { str1[j]=str1[j+str2_len]; } str1[j]='\0'; i--; } } //5. 输出结果 printf("str1=%s\n",str1); return 0; } |
4.字符串查找:从键盘上录入一个字符串,查找字符串里有几个特定的单词。再输出结果。
比如:原字符串”akjbcds123dfjvbf123fdvbfd123”
查找的单词:“123”
输出结果:3
5.字符串排序:从键盘上录入一个字符串,按照小到大的顺序排序。
#include #include int main() { char str1[100]; int len=0; int i,j; int tmp; printf("输入要排序的字符串:"); scanf("%s",str1); len=strlen(str1); //开始排序 for(i=0;i;i++)<> { for(j=0;j;j++)<> { if(str1[j]>str1[j+1]) { tmp=str1[j]; str1[j]=str1[j+1]; str1[j+1]=tmp; } } } printf("排序之后的字符串:%s\n",str1); return 0; } |
6.字符串的插入:从键盘上录入一个字符串,从指定位置插入一个字符串,再输出结果。
比如:原字符串“1234567890”
(1).从指定位置插入新的单词。 比如 从第2个下标插入一个“ABC”字符串。
结果:“123ABC4567890”
(2).从指定单词后面插入新的单词。 比如 从”123”这个单词后插入一个“ABC”字符串。
结果:“123ABC4567890”
7.字符串替换: 从键盘上录入一个字符串,将指定单词替换成想要的单词。
比如:原字符串“123jfvfdj123dkfvbfdvdf”
想要将“123”替换成“888”或者“8888”或者“88”
#include #include int main() { char str1[100]; char str2[100]; char str3[100]; int str1_len=0; int str2_len=0; int str3_len=0; int i,j; int cnt=0; /*1.准备数据*/ printf("输入源字符串:"); scanf("%s",str1); printf("输入查找的字符串:"); scanf("%s",str2); printf("输入替换的字符串:"); scanf("%s",str3); /*2. 计算长度*/ str1_len=strlen(str1); str2_len=strlen(str2); str3_len=strlen(str3); /*3. 字符串替换*/ for(i=0;i;i++)<> { //查找字符串 for(j=0;j;j++)<> { if(str1[i+j]!=str2[j])break; } //如果查找成功就进行替换 if(j==str2_len) { //总长度变短了 if(str2_len>str3_len) { cnt=str2_len-str3_len; //差值 //完成数据向前移动--覆盖 for(j=i+str2_len-cnt;j;j++)<> { str1[j]=str1[j+cnt]; } str1[str1_len-cnt]='\0'; } //总长度变长了 else if(str2_len)<> { cnt=str3_len-str2_len; //差值 //完成数据向后移动 for(j=str1_len;j>=i+str2_len;j--) { str1[j+cnt]=str1[j]; } str1[str1_len+cnt]='\0'; } //替换 for(j=0;j;j++)<> { str1[i+j]=str3[j]; } //重新计算长度 str1_len=strlen(str1); } } /*4. 完成字符串打印*/ printf("str1=%s\n",str1); return 0; } |
8.从键盘上输入一个整数:将整数转为字符串输出。
比如:int a; scanf(“%d”,&a);使用字符串形式打印出a的值。
#include #include int main() { char str[100]; char str1[100]; int data=0; int j=0,i=0; printf("从键盘上输入整数:"); scanf("%d",&data); // 123 -->'1' '2' '3' while(data) { str[i++]=data%10+'0'; data=data/10; } for(j=0;j;j++)<> { str1[j]=str[i-j-1]; } str1[j]='\0'; printf("str1=%s\n",str1); return 0; } |
9.从键盘上输入一个字符串,转为整数输出。
#include #include int main() { //"123" char str[100]; int data=0; int i=0; printf("从键盘上输入字符串:"); scanf("%s",str); while(str[i]!='\0') { data*=10;//data=0 data=10 data=120 data+=str[i]-'0';//data=1 data=12 data=123 i++; } printf("data=%d\n",data); return 0; } |
10.回文字符串。 “121”,“1221”
11.将第8题和第9题转成浮点数。
12.将10进制数据转为16进制输出。 比如: 3 --->0x3
13.将10进制数据转为二进制输出。
知识点2:字符串到整数-浮点数的格式化转换
//输出的都是字符串
#include int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); //格式化转换函数 int snprintf(char *str, size_t size, const char *format, ...); #include #include int main() { char str[100]; sprintf(str,"%s%s%s%d%c%f","123","456","789",666,'A',123.456); printf("str=%s\n",str); return 0; } |
//输入的是字符串
#include int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); #include #include int main() { float a; char str[]="123.456"; sscanf(str,"%f",&a); //"123" printf("a=%f\n",a); return 0; } |
//字符串转整数
#include int atoi(const char *nptr); long atol(const char *nptr); long long atoll(const char *nptr); long long atoq(const char *nptr); |
知识点3:多维数组
一维数组和二维数组使用频率较高。
一维数组: 定义的时候只有一个下标。 char buff[100];
二维数组: 定义的时候只有二个下标。 char buff[10][100];
二维数组可以看成一个矩阵。char buff[行][列];
3.1二维数组特点:
二维数组定义的时候,如果赋了初始值,行可以省略掉,列不可用省略。
int main() { char data1[3][3]={{1,2,3},{4,5,6},{7,8,9}}; char data2[3][3]= { {1,2,3}, {4,5,6}, {7,8,9} }; //第1个[]指定有多少个一维数组,第2个指定1维数组有多大 char data3[][5]= { 1,2,3, 4,5,6, 7,8,9 }; return 0; } |
3.2.二维数组如何访问成员?
3.3 作业
定义一个int类型的二维数组,比如:[400][400],从键盘上向这个二维数组录入数据,计算二维数组交叉数据之和。 ---计算矩阵交叉—对角线数据的和。
#include #include int main() { int data[4][4]; int i,j; //从键盘上录入数据 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&data[i][j]); } } return 0; } |
知识点4:一行代码上字符串太长该如何定义?
#include #include int main() { //第一种方法: char str1[]="1234567890123456789012 \ 34567890123456789012345678901234567 \ 89012345678901234567890123456789012 \ 345678901234567890"; //第二种方法: char str2[]="1234567890" "123456789012345678901234" "567890123456789012345678" "9012345678901234567890"; printf("str1=%s\n",str1); printf("str2=%s\n",str2); return 0; } |
知识点5:一维指针
5.1指针的概念
指针变量如何定义?
#include #include int main() { char *p1; //定义一个char类型的指针变量 int *p2; //定义一个int类型的指针变量 //int类型的指针变量:存放地址数据。 int data=123; //定义一个int类型的变量 //int类型的变量:存储整数数据。 return 0; } |
指针如何使用?
#include #include int main() { // &data 取地址 a&b按位与 a&&b 并且 // int *p定义一个int类型的指针 // *p 取出指针指向空间中的数据--取数据 // a*b a和b乘法 int *p; //指针变量本身就是存放地址的 int data=123; //p=data; //错误:data本身只是一个变量标识符,不是地址 p=&data; //将data的地址赋值给指针p printf("*p=%d\n",*p); //取出指针p指向空间中的数据 *p=666; //给指针指向的空间赋值 printf("data=%d\n",data); return 0; } |
什么是野指针?
野指针就是本身没有合法地址空间---非法指针。
野指针会导致的常见错误:段错误。
下面代码就会导致段错误:
#include #include int main() { int *p;//指针只能存放地址 *p=123; printf("*p=%d\n",*p); return 0; } |
指针本身占的空间是多少?
所有指针类型都占4个字节空间。和类型没有关系。
#include #include int main() { int *int_p;//指针只能存放地址 int int_a; char *char_p;//指针只能存放地址 char char_a; float *float_p;//指针只能存放地址 float float_a; double *double_p;//指针只能存放地址 double double_a; printf("int_a=%d\n",sizeof(int_a));//4 printf("int_p=%d\n",sizeof(int_p));//4 printf("char_a=%d\n",sizeof(char_a)); printf("char_p=%d\n",sizeof(char_p)); printf("float_a=%d\n",sizeof(float_a)); printf("float_p=%d\n",sizeof(float_p)); printf("double_a=%d\n",sizeof(double_a)); printf("double_p=%d\n",sizeof(double_p)); return 0; } |
5.2指针访问数组成员
访问一维数组成员的方式有哪些?
#include #include int main() { int a[]={1,2,3,4,5,6,7,8,9,0}; int *p; p=a; printf("下标4的值:%d\n",a[4]); //5 printf("下标4的值:%d\n",*(a+4)); //5 printf("下标4的值:%d\n",*(p+4)); //5 return 0; } |
指针访问一维数据常用的操作方式:字符串
#include #include int main() { char str[]="1234567890"; char *p=str; int len=0; printf("p=%s,str=%s\n",p,str); //计算字符串的长度 while(*p++!='\0') { len++; } printf("len=%d\n",len); return 0; } |
指针自增和自减?++和—运算符
#include #include int main() { int a[]={1,2,3,4,5,6,7,8,9,0}; int *p=a; printf("%d\n",*p); //1 printf("%d\n",*p++); //1 printf("%d\n",*p); //2 printf("%d\n",*(p+3));//5 printf("%d\n",*p);//2 printf("%d\n",*(++p));//3 printf("%d\n",*p);//3 printf("%d\n",*p--);//3 printf("%d\n",*p);//2 return 0; } |
指针自增自减偏移字节是多少? 与指针本身的类型有关系。
#include #include int main() { /* int a[]={1,2,3,4,5,6,7,8,9,0}; int *p=a; printf("偏移之前的地址:p=%#x\n",p); *(p++); printf("%d\n",*p); //2 printf("偏移之后的地址:p=%#x\n",p); */ char a[]={1,2,3,4,5,6,7,8,9,0}; char *p=a; printf("偏移之前的地址:p=%#x\n",p); *(p++); printf("%d\n",*p); //2 printf("偏移之后的地址:p=%#x\n",p); return 0; } |
数组本身可以当做指针使用吗?不可以
指针特点:自增、自减、可以改变指向。
#include #include int main() { int a[]={1,2,3,4,5}; //*(a+3) int b[]={11,12,13,14,15}; //下面3行代码是错误的 a--; a++; a=b; return 0; } |
指针可以当做数组使用吗? 可以
数组特点:可以通过下标访问数组成员。
#include #include int main() { int a[]={1,2,3,4,5}; int *p=a; printf("%d\n",a[0]); printf("%d\n",p[0]); //*p return 0; } |
5.3数组指针
数组指针可以指向一个一维数组,行指针也叫一维数组指针。
定义语法: char (*p)[5];该指针指向一个二维数组里的一个一维数组地址,一维数组的成员是5个字节。
二维数组的定义方法: char a[10][5];
#include #include int main() { int (*p)[5]; //定义一个一维数组指针---行指针 int a[2][5]= { {1,2,3,4,5}, {6,7,8,9,10} }; p=a; //将a地址给p指针 printf("%d\n",p[0][2]); p++; //加一个一维数组的大小 printf("%d\n",p[0][2]); return 0; } |
5.4指针数组
指针数组: 表示该数组成员可以存放指针。
指针数组定义语法:int *p[5];表示定义一个int数组,该数组的类型可以存放5个int类型的指针变量(地址)。
#include #include int main() { int a,b,c; int *p[3]; //一次定义3个int类型的指针变量 //存放地址 p[0]=&a; p[1]=&b; p[2]=&c; //对空间赋值 *p[0]=123; *p[1]=456; *p[2]=789; //取出数据 printf("%d\n",*p[0]); printf("%d\n",*p[1]); printf("%d\n",*p[2]); return 0; } #include #include int main() { char a[][100]={"小明","小白","小李"}; char *p[]={"小明","小白","小李"}; printf("%s\n",a[0]); printf("%s\n",p[0]); return 0; } |
5.5字符串查找函数
5.6指针类型常见的初始化值:NULL
#include #include int main() { char *p=NULL; // (void*)0 == NULL printf("%#x\n",p); if(p!=NULL) { //判断指针是否可以使用 } return 0; } |
5.7作业:字符串解析
1.练习上午学习的新知识。
2.解析GPS的数据。GPS芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。
发表评论
暂时没有评论,来抢沙发吧~