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