首页 > 代码库 > 第四天:C基础之字符与字符串
第四天:C基础之字符与字符串
今天老师主要是通过练习程序来讲解字符和字符串,所以这次日志也是通过分析代码来总结所学知识。
首先是复制字符 ,要注意‘\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 }
其中 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); }}
嵌入式驱动编写主要是对整型和字符串进行操作,所以今天的课程尤为重要。
第四天:C基础之字符与字符串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。