字符串:本身属于字符数组、字符串结尾有’\0’。
1. 从键盘上输入一串字符串,计算字符串里的空格、大写字母、小写字母、数字个数
2. 字符串比较:从键盘上录入2个字符串,判断是否相等。
#include int main() { char str1[100]; char str2[100]; int i=0; /*1. 录入数据*/ printf("输入字符串1:"); scanf("%s",str1); printf("输入字符串2:"); scanf("%s",str2); /*2. 比较字符串*/ while(str1[i]!='\0'||str2[i]!='\0') { if(str1[i]!=str2[i])break; i++; } if(str1[i]=='\0'&&str2[i]=='\0') { printf("字符串相等.\n"); } else { printf("字符串不相等.\n"); } return 0; } |
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”
#include #include
int main() { char str1[100]; char str2[100]; int addr=0; int str1_len; int str2_len; int i; /*1. 录入数据*/ printf("录入源字符串:"); scanf("%s",str1); printf("录入要插入的字符串:"); scanf("%s",str2); printf("输入要插入的下标位置:"); scanf("%d",&addr); str1_len=strlen(str1); //3 str2_len=strlen(str2); //2
/*2. 完成插入*/ //完成数据移动 for(i=str1_len-1;i>=addr;i--) { str1[i+str2_len]=str1[i]; } //数据替换 for(i=0;i;i++)<> { str1[i+addr]=str2[i]; } str1[str1_len+str2_len]='\0'; /*3. 输出数据*/ printf("str1=%s\n",str1); return 0; } |
(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进制数据转为二进制输出。
//输出的都是字符串
#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); |
一维数组和二维数组使用频率较高。
一维数组: 定义的时候只有一个下标。 char buff[100];
二维数组: 定义的时候只有二个下标。 char buff[10][100];
二维数组可以看成一个矩阵。char buff[行][列];
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; } |
#include #include int main() { char data[3][3]= { {1,2,3}, {4,5,6}, {7,8,9} }; printf("第1行的第2列:%d\n",data[1][2]);
char str[][100]={"123","456","789","中国","嵌入式"}; printf("%s\n",str[3]);// str[3]== char str[]="中国"; return 0; } |
定义一个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; } |
#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; } |
指针就是地址。C语言里指针可以直接访问地址,计算机的CPU、外设硬件都是依靠地址操作的。
指针变量如何定义?
#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; } |
访问一维数组成员的方式有哪些?
#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; } |
数组指针可以指向一个一维数组,行指针也叫一维数组指针。
定义语法: 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; } |
指针数组: 表示该数组成员可以存放指针。
指针数组定义语法: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; } |
#include char *strstr(const char *源字符串, const char *要查找的字符串); 函数功能: 就是在源字符串里查找指定的字符串,查找到之后就返回该字符串的地址。
#include #include int main() { char str[]="123abc4567890"; char *p; p=strstr(str,"abc"); printf("%s\n",p); return 0; } |
#include #include int main() { char *p=NULL; // (void*)0 == NULL printf("%#x\n",p); if(p!=NULL) { //判断指针是否可以使用 } return 0; } |
1. 练习上午学习的新知识。
2. 解析GPS的数据。GPS芯片接收到卫星的信号之后,会通过字符串的形式将解析的数据输出。
#include #include int main() { char gps_data[]= { "$GNGGA,114955.000,2842.4158,N,11549.5439,E,1,05,3.8,54.8,M,0.0,M,,*4F" "$GNGLL,2842.4158,N,11549.5439,E,114955.000,A,A*4D" "$GPGSA,A,3,10,31,18,,,,,,,,,,5.7,3.8,4.2*37" "$BDGSA,A,3,07,10,,,,,,,,,,,5.7,3.8,4.2*2A" "$GPGSV,3,1,10,10,49,184,42,12,16,039,,14,54,341,,18,22,165,23*7B" "$GPGSV,3,2,10,22,11,318,,25,51,055,,26,24,205,,29,13,110,*7C" "$GPGSV,3,3,10,31,50,287,36,32,66,018,*7F" "$BDGSV,1,1,04,03,,,07,05,,,29,07,79,246,33,10,52,232,19*62" "$GNRMC,114955.000,A,2842.4158,N,11549.5439,E,0.00,44.25,061117,,,A*4D" "$GNVTG,44.25,T,,M,0.00,N,0.00,K,A*14" "$GNZDA,114955.000,06,11,2017,00,00*47" "$GPTXT,01,01,01,ANTENNA OK*35" }; return 0; } |
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !