身份证验证、字符串删除、扩展字母、空格转化、位运算

来源:互联网 发布:c语言和java区别 编辑:程序博客网 时间:2024/05/29 03:39

 1     这个身份证验证比较简单,没有区号的,仅仅判断18位的身份证和年月日正确与否,但是里面用到的思想很好呀,我自己做好的时候就是傻傻的用if,else无限判断我感觉自己都烦,驰哥说只要把对应的润年和平年写进数组,这就一下子简单,也就是空间换时间,我感觉这很划算啊,毕竟速度快了

#include <stdio.h>#include <stdlib.h>#include <string.h>#define TRUE     (1)#define FALSE    (0)#define IDEN_LEN (18)#define YEAR_LEN  (5)#define MON_LEN   (3)#define DAY_LEN   (3)#define Y_BEGIN  (1900)#define Y_END    (2015)#define M_BEGIN  (1)#define M_END    (12)#define D_BEGIN  (1)#define D_END    (31)#define RUN      (1)#define PIN      (0)//每年每月的天数,ymd[0]平年,ymd[1]闰年int ymd[2][13] = {{1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},                  {1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};                   typedef unsigned char Boolean;Boolean get_birthday(const char *src_str, char *re_str);static Boolean judge_input_legal(const char *src_str);static Boolean judge_year_month_day(const char *src_str);static Boolean judge_run_year(const int year);static Boolean judge_run_year(const int year){    int year_value = year;    if(year_value % 4 == 0 && year_value % 100 != 0    || year_value % 400 == 0){        return TRUE;    }else{        return FALSE;    }}static Boolean judge_year_month_day(const char *src_str){    //年月日的字符数组以及对应的整型值    char year[YEAR_LEN] = {0};    char month[MON_LEN] = {0};    char day[DAY_LEN] = {0};    int  year_value = 0;    int  month_value = 0;    int  day_value = 0;       Boolean is_run = FALSE;        // 61040419920229351X    //取得年月日信息    strncpy(year, src_str + 6, 4);    strncpy(month, src_str + 10, 2);    strncpy(day, src_str + 12, 2);    year_value = atoi(year);    month_value = atoi(month);    day_value = atoi(day);    //判断年月日是否超过上下限    if(year_value < Y_BEGIN || year_value > Y_END    || month_value < M_BEGIN || month_value > M_END    || day_value < D_BEGIN || day_value > D_END){        return FALSE;    }         //判断是否是闰年    if((is_run = judge_run_year(year_value)) == TRUE){       if(day_value < 0 || day_value > ymd[RUN][month_value]){           return FALSE;       }    }else{       if(day_value < 0 || day_value > ymd[PIN][month_value]){           return FALSE;       }    }    return TRUE;}static Boolean judge_input_legal(const char *src_str){    int i = 0;    Boolean ymd_ok = FALSE;       while(src_str[i] != '\0' && i < IDEN_LEN - 1){        if(!isdigit(src_str[i])){            return FALSE;        }        i++;    }    //判断最后一位    if(!(isdigit(src_str[i]) || src_str[i] == 'X')){        return FALSE;    }    ymd_ok = judge_year_month_day(src_str);    return ymd_ok;}Boolean get_birthday(const char *src_str, char *re_str){    int src_len = 0;       Boolean ok = FALSE;    //判断字符串的合法性    if(src_str == NULL || re_str == NULL){        return FALSE;    }    //判断输入字符串的格式是否符合身份证要求    src_len = strlen(src_str);       if(src_len != IDEN_LEN){   //判断长度        return FALSE;    }    //判断身份证是否合法,合法取出年月日信息    ok = judge_input_legal(src_str);    if(ok == TRUE){          strncpy(re_str, src_str + 6, 8);        re_str[8] = '\0';        return TRUE;    }    return FALSE;}int main(int argc, char **argv){    char str[20] = "61040419920230351X";    char re_str[20]  = {0};    Boolean ok = FALSE;    ok = get_birthday(str, re_str);    if(ok == TRUE){        printf("the birthday is:%s\n", re_str);    }else{        printf("the identity card is error!\n");    }    return 0;}

2 字符串删除操作

  感觉自己的代码还是不太规范

#include <stdio.h>#include <string.h>int main(int argc,char *argv[]){   char str[1000] = {0};   char ch[1000] = {0};   char str_2[1000]={0};   int str_strlen = 0;   //str长度   int ch_strlen = 0;    //ch长度   int count = 0;           int i = 0;   int j = 0;      int k = 0;  // 标记当前的i值   scanf("%s",str);   scanf("%s",ch);   // 计算str和ch的长度   str_strlen = strlen(str);   ch_strlen = strlen(ch);   //处理   for(i = 0;i< str_strlen;i++)   {                   if(str[i] == ch[0]) //每次从ch[0]开始判断       {           k = i;           for(j =0;j< ch_strlen;j++)           {              if(str[i+j] != ch[j])                  break;              count++;           }           //count记录循环的次数,如果相等,那么直接让i值跳过去那么多           if(count == ch_strlen)            {                             i =k + ch_strlen-1;                         }else{              str_2[num++] = str[i];           }           count = 0;   // 每一次判断完之后  count初始化为0       }else{           str_2[num++] = str[i];       }                    }   printf("%s\n",str);   printf("%s\n",str_2);   return 0;}

规范的字符串删除,尽量把每一个功能写成一个函数

#include <stdio.h>#define TRUE   (1)#define FALSE  (0)typedef unsigned char Boolean;Boolean del_substr(char *string, const char *substr);static char *my_strstr(char *string, const char *substr);static int my_strlen(const char *string);static char *my_strcpy(char *des_str, const char *src_str);static char *my_strcpy(char *des_str, const char *src_str){    char *des = des_str;    const char *src = src_str;    if(des_str == NULL || src_str == NULL    || des_str == src_str){        return des_str;    }    while((*des++ = *src++) != '\0'){        /*do nothing*/    }    return des_str;}static int my_strlen(const char *string){    int len = 0;    const char *str = string;    if(string == NULL){        return len;    }    while(*str != '\0'){        str++;        len++;    }    return len;}static char *my_strstr(char *string, const char *substr){    char *str = string;     const char *sub = substr;    while(*str != '\0' && *sub != '\0'){        if(*str == *sub){           //如果两个指针指向的空间内容相等,则都向后移动           str++;           sub++;        }else{           str -= (sub - substr - 1);           //  hello,everyoneworld           //           //        everyone\0           sub = substr;        }    }       if(*sub == '\0'){    //被匹配的串完全找到        return str -= (sub - substr);    }    return NULL;}Boolean del_substr(char *string, const char *substr){    char *find_index = NULL;    char *copy_start = NULL;    char *str = string;    const char *sub = substr;    //1.进行参数检测    if(string == NULL || substr == NULL){        return FALSE;    }    //2.查找substr是否存在于string    //    3.如果找到substr,则在string中进行删除操作;    //    否则直接返回FALSE;    find_index = my_strstr(str, sub);    if(find_index == NULL){        return FALSE;    }else{    //找到后删除        //hello,everyoneworld        //        //      everyone        copy_start = find_index + my_strlen(sub);        my_strcpy(find_index, copy_start);        return TRUE;    }}int main(int argc, char **argv){    char str1[] = "hello, everyoneworld!";    char str2[] = "everyone";    Boolean find = FALSE;        //"hello, world!"  ==> result    find =  del_substr(str1, str2);    if(find == TRUE){        printf("str2 found! the result string is :%s\n", str1);    }else{        printf("str2 is not located in str1!\n");    }    return 0;}

3  扩展字母,

#include <stdio.h>#include <string.h>int main(int argc,char **argv){    char str[1000] = {0};    char dest_str[1000]={0};    char ch;    char *pstr = str;    int length = 0;    int count = 0;    int i = 0;    int j = 0;    scanf("%s",str);        length = strlen(str);        for(i = 0;i<length-1;i++)    {        ch = str[i];        if(str[i+1] == '-')        {            if(ch < str[i+2])            {                for(j = ch ;j <= str[i+2];j++)                   dest_str[count++] = j;                             }            i += 2;        }else{          dest_str[count++] = str[i];        }    }    printf("dest_str = %s\n",dest_str);    return 0;}

4    空格转化

#include <stdio.h>void blank_transform(char *string, int length);void blank_transform(char *string, int length){    char *str = string;    int  src_len = 0;    int  new_len = 0;    int  blank_count = 0;     char *new_str = NULL;    //1.检测传入的参数是否合法    if(string == NULL || length <= 0){        return ;    }    //2.统计字符串的长度和空格的数量    while(*str != '\0'){        if(*str == ' '){            blank_count++;        }        src_len++;        str++;    }    //3.计算新的字符串长度是否合法    new_len = src_len + (blank_count << 1);    if(new_len == src_len || new_len > length - 1){        return ;    }        //4.进行转换    new_str = string + new_len;       while(str >= string){        if(*str == ' '){            *new_str-- = '0';            *new_str-- = '2';            *new_str-- = '%';        }else{            *new_str-- = *str;        }        str--;    }}int main(int argc, char **argv){    char str[100] = "we are linuxer";    // we%20are%20linuxer.    printf("before transform :%s\n", str);    blank_transform(str, 100);   //把空格转换成%20    printf("after transform :%s\n", str);    return 0;}

5  位运算

#include <stdio.h>int get_one_count1(int value);int get_one_count2(int value);int get_one_count3(int value);int get_one_count4(int value);void print_bits(int value);void print_bits(int value){    int i = 0;    // 00001001 11110001 10001001 11000101      for(i = sizeof(int) * 8 - 1; i >= 0; --i){        if(value >> i & 1){            printf("1");        }else{            printf("0");        }                //     0000 1010          //         //     0000 1000        //        //     0000 0010        //        //        //     0000 1010        //        //     0000 0111        //        //     0000 0010        if((i & 7) == 0){            printf(" ");        }    }    printf("\n");}int get_one_count4(int value){    int result = 0;    // 0110 1000    //    // 0110 0111    //    // 0110 0000    //    // 0101 1111    //    // 0100 0000    //    // 0011 1111    //    // 0000 0000    //      result = (value == 0)? 0 : 1;    while(value &= (value - 1)){        result++;    }    return result;}int get_one_count3(int value){      int val = value;    int result = 0;        //0001 1010    //    //0000 1101    //        1    //    //    //1000 0101    //    //1100 0010    //     //1110 0001    //    //1111 1111      while(val){        if(val & 1){            result++;        }        val >>= 1;    }      return result;}int get_one_count2(int value){    int slab_count = sizeof(int) * 8 - 1;    int result = 0;     // 0001 0101    //    // 0001 0000    while(slab_count-- >= 0){        if((1 << slab_count) & value){             result++;        }    }     return result;}int get_one_count1(int value){    int slab_count = sizeof(int) * 8 - 1;    int result = 0;    int i = 0;    // 11111111 11111111 11111111 11111110    //    // 11111111 11111111 11111111 11111111    int a = 10;    while(i <= slab_count){        if((value >> i) & 1){             result++;        }        i++;    }    return result;}int main(int argc, char **argv){    int a = -2;    int result = 0;    result = get_one_count4(a);    printf(" the count:%d\n", result);    print_bits(a);    return 0;}


0 0