C语言的几道面试题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuruhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值