首页 > 代码库 > 第四天: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 }
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);}
View Code

第四个函数是判断一个数是否为回文。也顺利写出。

 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

 

嵌入式驱动编写主要是对整型和字符串进行操作,所以今天的课程尤为重要。

 

第四天:C基础之字符与字符串