1、实现一个对8bit数据(usigned char)类型的指定位(例如第n位)的置0或置1操作,功能保持其他位不变。函数原型:
void bit_set(unsigned char *p_data,unsigned char position,int flag)
p_data是指定的源数据;position是指定位(取值范围1~8);flag表示置0还是置1操作。
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<assert.h>
void bit_set(unsigned char *p_data,unsigned char pos,int flag)
{
assert(p_data!=NULL);
assert((pos>=1)&&(pos<=8));
if(1==flag){
//将一个二进制位的第n位置1,则将这一位按位或1,其余位按位或0
*p_data|=1<<(pos-1);
}else if(0==flag){
//将一个二进制位的第n位置0,按位与1
//1左移pos-1位,按位取反后按位与
*p_data&=~(1<<(pos-1));
}
}
int main()
{
unsigned char num=0;
bit_set(&num,4,1);
printf("%d\n",num);
bit_set(&num,4,0);
printf("%d\n",num);
return 0;
}
2、实现字符串左循环移位函数,比如“abcdefghi"左移两位是"hiabcdefg"。函数原型:
void RightLoopMove(char *pStr,unsigned short steps)
(1)暴力求解法:
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<assert.h>
void RightLoopMove(char *pStr,unsigned short steps){
int len=0;
char tmp=0;
int i=0;
int j=0;
assert(pStr!=NULL);
len=strlen(pStr);
for(j=0;j<steps;j++){
tmp=*(pStr+len-1);//保存最后一个元素的空间
//把前面的元素一次往后挪
for(i=0;i<len-1;i++){
*(pStr+len-1-i)=*(pStr+len-2-i);
}
*pStr=tmp;
}
}
int main()
{
//char* p是常量字符串不可以更改
char arr[]="abcdefghi";
RightLoopMove(arr,2);
printf("%s\n",arr);
return 0;
}
改进:
void RightLoopMove(char *pStr,unsigned short steps){
int len=0;
char tmp=0;
int i=0;
int j=0;
char *cur=NULL;
assert(pStr!=NULL);
len=strlen(pStr);
for(j=0;j<steps;j++){
cur=pStr+len-2;
tmp=*(pStr+len-1);//保存最后一个元素的空间
//把前面的元素一次往后挪
for(i=0;i<len-1;i++){
*(cur+1)=*cur;
cur--;
}
*pStr=tmp;
}
}
int main()
{
//char* p是常量字符串不可以更改
char arr[]="abcdefghi";
RightLoopMove(arr,2);
printf("%s\n",arr);
return 0;
}
(2)先逆序单个的串,再逆序整个串
void Reverse(char *left,char *right){
while(left<right){
char tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void RightLoopMove(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* p是常量字符串不可以更改
char arr[]="asdfgfve";
RightLoopMove(arr,2);
printf("%s\n",arr);
return 0;
}
3、实现字符串到整数的转换,例如输入字符串”12345“,输出整数12345。
# include<stdio.h>
# include<stdlib.h>
# include<assert.h>
# include<string.h>
enum Status{
VALID,//合法
INVALID//非法
}
//考虑空字符串
//+-
//异常字符
//溢出
enum Status status=INVALID;
int my_atoi(const char* str){
int flag=1;
long long ret=0;
assert(str!=NULL);
if(*str=='\0'){
return 0;
}
while(*str){
//空白字符
if(isspace(*str)){
str++;
}
//非空白字符
//+-
if(*str=='-'){
flag=-1;
str++;
}
if(*str=='+'){
str++;
}
//
while(*str){//*str不是\0,检测是不是数字字符
if(isdigit(*str)){
//12345
ret=ret*10+flag*(*str-'0');
if(ret>INT_MAX||ret<INT_MIN){
if(flag==1){
return INI_MAX;
}
⮂⮂ buffers
else{
return INT_MIN;
}
}
}else{
return (int)ret;
}
str++;
}
status=VALID;
return (int)ret;
}
int main(){
char *p="12345";
int num=my_atoi(p);
pintf("%d\n",num);
return 0;
}