知識點1:字符串
字符串:本身屬于字符數組、字符串結尾有’\0’。
1.1字符串作業
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進制數據轉為二進制輸出。
知識點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.二維數組如何訪問成員?
#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; } |
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指針的概念
指針就是地址。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; } |
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字符串查找函數
#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; } |
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芯片接收到衛星的信號之后,會通過字符串的形式將解析的數據輸出。
#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; } |
審核編輯:湯梓紅
-
C語言
+關注
關注
180文章
7604瀏覽量
136692 -
字符串
+關注
關注
1文章
578瀏覽量
20506 -
數組
+關注
關注
1文章
417瀏覽量
25939
發布評論請先 登錄
相關推薦
評論