1.实现对一个8bit位数据(unsigned char 类型)的指定位(例如第n位)的置0或置1操作,并保持其他位不变。
函数原型:
void bit_set(unsigned char *p_data,unsigned char position,int flag)
函数参数说明:P_data是指定的原数据,position是指定位(取值范围为1~8),flag表示是置0还是置1.
举例说明一下,比如数字15,q它的二进制序列为0000 1111
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void bit_set(unsigned char *p_data,unsigned char position,int flag)
{
assert(p_data);
assert((position>=1)&&(position<=8));
if(flag==1)//置1操作
{
*p_data |= (1<<(position-1));
}
else if(flag==0)//置0操作
{
*p_data &= ~(1<<(position-1));
}
else
{
printf("flag参数错误!\n");
}
}
int main()
{
unsigned char num=0;
unsigned char pos=0;
int flag=0;
printf("请输入各自的值:num pos flag\n");
scanf("%d %d %d",&num,&pos,&flag);
bit_set(&num,pos,flag);
printf("%d\n",num);
system("pause");
return 0;
}
2.将一个字符串循环右移n位
函数原型:
void RightLoopMove(char *pStr,unsigned short steps)
下面用常用的两种方法实现
代码实现:
<pre name="code" class="cpp">#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.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 RightLoopMove(char *pStr,unsigned short steps)//三步翻转法
//{
// int len=strlen(pStr);
//if(steps>len)//防止给出的翻转位数大于字符串长度
// {
// steps%=len;
// }
// reverse(pStr,pStr+len-1-steps);
// reverse(pStr+len-steps,pStr+len-1);
// reverse(pStr,pStr+len-1);
//}
void RightLoopMove(char *pStr,unsigned short steps)//循环右移
{
int len=strlen(pStr);
assert(pStr);
if(steps>len)//防止给出的翻转位数大于字符串长度
{
steps%=len;
}
while(steps)
{
int cur=0;
char tmp=pStr[len-1];
for(cur=len-1; cur>0; cur--)
{
pStr[cur]=pStr[cur-1];
}
pStr[cur]=tmp;
steps--;
}
}
int main()
{
char arr[]="abcdef";/*因为参数需要修改,必须采用数组传参,
指针传参为字符串的首地址,不能被修改*/
unsigned short steps=0;
printf("请输入你要循环右移的位数:");
scanf("%d",&steps);
RightLoopMove(arr,steps);
printf("%s\n",arr);
system("pause");
return 0;
}
3,编写程序实现字符串到整数的转换,如"12345"---->12345.
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<ctype.h>//isspace isdigit的库函数
enum State//判断程序是否正常结束
{
INVALID,//值为0,表示非正常结束
VALID//值为1,表示正常结束
};
enum State state;//定义枚举类型的变量
int my_atoi(char *str)
{
int flag=1;//符号位
long long ret=0;//设置一个较大的数保存返回值,防止溢出
assert(str);
state=INVALID;//先赋值为非正常结束
while(isspace(*str))//判断字符串是否为空白字符
{
str++;
}
if(*str=='\0')//空字符串,直接结束
{
return 0;
}
if(*str=='-')//第一个字符为‘-’,转换后为负数
{
flag=-1;
str++;
}
else if(*str=='+')//正数的情况
{
str++;
}
while(isdigit(*str))//判断是否为数字字符
{
ret=ret*10+flag*(*str-'0');
if(ret>INT_MAX || ret<INT_MIN)//判断数据是否溢出,若溢出,直接返回
{
return 0;
}
str++;
}
if(*str=='\0')//表示正常结束,找到字符串的'\0'
{
state=VALID;
return (int)ret;
}
else//异常结束
{
return ret;//可能丢掉一部分数据
}
}
int main()
{
char *p="12345";
int ret=my_atoi(p);
printf("%d\n",ret);
system("pause");
return 0;
}