今天老师主要是通过练习程序来讲解字符和字符串,所以这次日志也是通过分析代码来总结所学知识。
首先是复制字符 ,要注意‘\0‘的存在。使用循环时,一般用‘\0’进行退出判断条件。
#include<stdio.h> int copy(char *n,char *m); int main() { char arr[] = {"hello"}; char brr[10]; printf("%d\n",sizeof(arr)); /* int i; for(i=0;i<6;i++) { brr[i] = arr[i]; } printf("%s\n",brr); */ copy(arr,brr); printf("%s\n",brr); } int copy(char *n, char *m) { printf("%d\n",sizeof(n)); //n为指针 占四个字节 int i = 0; while(1) { m[i] = n[i]; if(n[i] == ‘\0‘) break; i++; } }
复制字符串
在这个程序中,我犯了一个错误。就是在子函数中,我直接用sizeof()函数,想得到字符串的长度 ,这明显是不正确的,在子函数中进行sizeof(n) ,所得到的结果为4,为char指针类型所占的字节数,而不是字符串的长度。要知道字符串长度可以使用 strlen()函数实现。
第二个程序是自己编写 strlen strcmp strstr strcat
1 #include<stdio.h> 2 int strlen(char *a); 3 int strcmp(char *a,char *b); 4 int strcat(char *a , char *b); 5 int strstr(char *a ,char *c); 6 int main() 7 { 8 char arr[] = {"hello world"} ; 9 char brr[] = {"good moring"} ; 10 char crr[] = {"world"}; 11 12 printf("arr 的长度为:%d\n",strlen(arr)); 13 printf("brr 的长度为:%d\n",strlen(brr)); 14 15 int k = strcmp(arr,brr); 16 if( k == 0 ) 17 printf("arr 等于 brr \n"); 18 else if( k < 0) 19 printf("arr 小于 brr\n"); 20 else printf("arr 大于 brr\n"); 21 22 strcat(arr,brr); 23 printf("arr+brr is %s\n",arr); 24 25 if( strstr(arr,crr) == NULL ) 26 printf("字符不存在\n"); 27 else 28 printf("所查找的字符位置在%d\n",strstr(arr,crr)); 29 } 30 31 int strlen(char *a) 32 { 33 int i = 0; 34 while(1) 35 { 36 if(*(a+i) == ‘\0‘) 37 break; 38 i++; 39 } 40 return i+1; 41 42 } 43 int strcmp(char *a , char *b ) 44 { 45 46 int i=0 ; 47 while(1) 48 { 49 if( *(a+i) < *(b+i)) 50 return -1; 51 if(*(a+i) > *(b+i)) 52 return 1; 53 if(*(a+i) == ‘\0‘) 54 if(*(b+i)==‘\0‘) 55 return 0; 56 i++; 57 } 58 59 } 60 int strcat(char * a , char * b) 61 { 62 int i,j; 63 for(i = strlen(a) -1,j = 0; ;i++,j++ ) 64 { 65 *(a+i) = *(b+j); 66 if( *(b+j) == ‘\0‘) 67 break; 68 } 69 70 }
string
其中 strstr函数功能未能 写出 ,第二个函数在使用man 参看意思时理解错误。理解为对比两个字符串的长度大小 。实际上是逐个比较ascii值。阅读英文水平要加强啊
第三个程序是计算字符串中单词的个数,没有多大问题
#include<stdio.h> int main() { char data[1024] = {"he ha heh kke eh jha ha h awed"}; int number = 0; int i; for(i=0;;i++) { if(*(data+i)==‘ ‘) if(*(data+i-1)!=‘ ‘) number ++; if(*(data+i)==‘\0‘) break; } if(number== 0) { printf("no word%d\n",number); return 1; } printf("word number is %d\n",number+1); }
第四个函数是判断一个数是否为回文。也顺利写出。
1 #include<stdio.h> 2 3 int main() 4 { 5 char data[1024] = {"abcdecba"}; 6 int i; 7 int n = strlen(data); 8 for(i=0;i<n;i++) 9 { 10 if(*(data+i)!=*(data+n-1-i)) 11 { 12 printf("%s不是回文\n",data); 13 return; 14 } 15 16 } 17 printf("%s是回文\n",data); 18 19 20 21 }
判断回文
第五个是判断一个数是否为三重回文,其中,需要将函数itoa将整型转换为字符串 。但是itoa不是标准库里面的函数,所以不能使用。就使用sprintf 代替。
#include<stdio.h> #include<string.h> int PanDuan(char *data); int main() { int i ; char a[1024] = {0}; char b[1024] = {0}; char c[1024] = {0}; for(i=0;i<1000;i++) { sprintf(a,"%d",i); sprintf(b,"%d",i*i); sprintf(c,"%d",i*i*i); if(PanDuan(a)) if(PanDuan(b)) if(PanDuan(c)) printf(" %d\n",i); } printf("\n"); } int PanDuan(char *data) { int i; int n = strlen(data); for(i=0;i<n;i++) { if(*(data+i)!=*(data+n-1-i)) { return 0; } } return 1; }
三重回文
第六个函数是统计字符串 ,要注意的是 写判断时,不能 使用 1< b < 5 因为 前一个如果正确,返回为1 ,然后就是对比1和5的大小。所以要用 1<b && b < 5 代替
#include<stdio.h> int main() { char data[1024] = {"There USA 8 Func And USB2.0 *10 00 ad"}; int i ; int big = 0; int small =0; int number = 0; int spe = 0; for(i=0;;i++) { if(122 >= *(data+i) && *(data+i) >= 97) small++; else if(90 >= *(data+i) && *(data+i)>= 65) big++; else if(57 >= *(data+i) && *(data+i )>= 48) number++; else spe++; if(*(data+i)==‘\0‘) break; } printf("big is %d\n",big); printf("small is %d\n",small); printf("number is %d\n",number); printf("spe is %d\n",spe); }
统计字符串组成
最后 一个代码是自己实现atoi 和itoa 函数
int atoi(int *number ,char *arr); int main() { char arr[10] = {"98457"}; int number = 0; int *p = &number; atoi(p,arr); printf("number is %d\n",number); } int atoi(int *number ,char *arr) { int i; for(i = 0; ; i++) { if(*(arr+i)==‘\0‘) break; *number =*number *10 + (*(arr+i) -48); } }
atoi
嵌入式驱动编写主要是对整型和字符串进行操作,所以今天的课程尤为重要。
时间: 2024-10-10 04:27:19