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; }
感觉自己的代码还是不太规范
#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; }
#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; }
#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; }