身份证验证、字符串删除、扩展字母、空格转化、位运算
来源:互联网 发布: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
- 身份证验证、字符串删除、扩展字母、空格转化、位运算
- 18位身份证验证
- 18位身份证验证
- 18位身份证验证
- java字符串应用之18位身份证格式验证
- C#控制台 Trim 删除字符串首字母前面的空格与尾字母后面的空格
- 18位身份证验证方法
- 18位身份证验证源代码
- 18位身份证验证方法
- 18位身份证验证方法
- 18位身份证验证方法
- 18位身份证验证代码
- 18位身份证验证代码
- 15位身份证转18位/18位身份证验证
- 数字字符串转化字母字符串
- 位运算将01字符串转化为相应二进制数
- rails 将字符串的起始字母大写并将下划线转化为空格
- rails 将字符串的起始字母大写并将下划线转化为空格
- CodeTyphon32中自带例子源码:根据数学表达式计算出结果
- 10大需要注意的web app问题
- 【IOS学习】IOS开发之视图和视图控制器
- Navicat Premium实现mysql数据库备份 还原
- Cocos2D中屏幕分辨率解释
- 身份证验证、字符串删除、扩展字母、空格转化、位运算
- Java 多态 后链接(late binding)与前链接(early binding) 向上转型(upcast)
- 黑马程序员——反射
- 黑马程序员——多线程
- iis8.5配置wcf
- Python图片中的缩放实现,以及多种尺寸icon的生成
- C++与Matlab混合编程之:矩阵数据结构
- android微信支付(问题总结)
- Android沉浸式状态栏攻略