您的位置:首页 > 其它

模拟实现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!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息