模拟实现atoi(),字符串循环位移,8bit位指定位的置0或置1
2016-05-30 16:29
375 查看
1.实现一个8bit数据的指定位的置0或置1操作,其他位不变; #include<stdio.h> #include<assert.h> void bit_set(unsigned char *p_data,unsigned char pos,int flag) { assert(p_data); assert(pos>=1&&pos<=8);//置位操作只能在1-8之间 if(flag==1)//置1 { *p_data|=(1<<(pos-1)); } else if(flag==0)//置0 { *p_data&=~(1<<(pos-1)); } } int main() { unsigned char c=0; bit_set(&c,3,0); printf("%d\n",c); return 0; } 15:00001111 00001011 2.实现字符串右循环位移函数,比如: "abcdefghi"循环右移两位就是"hiabcdefg". 方法一:逐步移位法 #include<stdio.h> #include<assert.h> #include<string.h> void RightLoopMove(char *pStr,unsigned short steps) { int len = strlen(pStr); assert(pStr); while(steps--) { char tmp=pStr[len-1];//保存最后一个变量 int i=0; for(i=len-1;i>0;i--)//将前面的变量依次向后挪一位 { pStr[i]=pStr[i-1]; } pStr[i]=tmp;//把最后一个变量放在第一个位置 } } int main() { char arr[]="abcdefdghi"; RightLoopMove(arr,2); printf("%s\n",arr); return 0; } 方法二:三步翻转法: #include<stdio.h> #include<assert.h> #include<string.h> void reverse(char *left,char *right)//翻转过程 { assert(left); assert(right); while(left<right) { char tmp=*left; *left = *right; *right =tmp; left++; right--; } } void RightLookMove(char *pStr,unsigned short steps) { int len=strlen(pStr); reverse(pStr,pStr+len-steps-1);//翻转前一部分 reverse(pStr+len-steps,pStr+len-1);//翻转后部分 reverse(pStr,pStr+len-1);//前后部分翻转以后整体翻转 } int main() { char arr[]="abcdefdghi"; RightLookMove(arr,2); printf("%s\n",arr); return 0; } 3.实现字符串到整数的转换,例如: 输入字符串"12345",输出数据为:12345; #include<stdio.h> #include<assert.h> #include<string.h> #include<stdlib.h> #include<ctype.h> enum State { VALID, //0 INVALID //1 }; enum State state=INVALID;//定义一个枚举变量 int My_atoi(char *str) { int sign=1; long long ret=0; assert(str); state=INVALID;//不合法 while(isspace(*str))//判断空白字符 { str++; } if(*str=='\0')//空字符串判断 { return 0; } if(*str=='+')//判断正号 { str++; } else if(*str=='-')//判断负号 { sign=-1; str++; } while(isdigit(*str))//判断是否为数字字符 { ret=ret*10+sign*(*str-'0'); if((ret>INT_MAX)||(ret<INT_MIN)) { return 0; } str++; } if(*str=='\0')//如果以'\0'结束,恢复合法状态,并返回值。 { state=VALID; return (int)ret; } else//没有以'\0'结束,则返回返回非数字字符前面已转换的数字 { return (int)ret;//异常值 } } int main() { char arr[]=" -1234po56"; int ret=My_atoi(arr); printf("%d\n",ret); return 0; }ok!!! come on!!!
相关文章推荐
- cci-Q1.8 调用一次子字符串判断确认s2是否为s1的旋转字符
- 左旋转字符串
- 编程珠玑-第二章(字符串旋转与排序)
- 模拟实现atoi函数
- 字符串的旋转--3步翻转法
- 实现一个函数,可以左旋字符串中的k个字符
- 科大讯飞笔试题目
- (剑指offer)左旋转字符串C++
- 字符串旋转问题
- windows下使用Redis存储
- Android中事件焦点抢占问题
- 最大熵模型介绍及实现
- MPEG2
- Mysql的帮助命令
- Delphi自动适应屏幕分辨率的属性
- android 端缓存清理的实现
- Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。
- Leetcode 之Binary Tree Postorder Traversal(47)
- [AngularJS] Default Child state and nav between child state
- 将图片转成base64字符串并在JSP页面显示的Java代码