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

 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;
}


你可能感兴趣的:(身份证验证、字符串删除、扩展字母、空格转化、位运算)