volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

     这篇文章开始的时候发布于: 2011年06月15日, 22点32分。

     但是由于我本人C语言水平有限, 并且在发布代码的时候没有进行调试, 使得第一个面试题的Exp代码出现错误, 虽然思路上没有错误,

但是有网友跟帖及时纠正了我的错误, 在此对:menggucaoyuan  表示感谢。 感谢他让我明白了一个道理:实践是检验整理的唯一标准。

     在此对由我的随笔引起阅读者的误解表示抱歉。在以后的随笔中我将保证没有经过验证的代码不再往博客园上贴发。

  下面是我已经修正过的代码:

#include<stdio.h>

void InvertStr(char *str)
{
  long int i=0;
  char *chTemp;
  char *Temp;

 chTemp=str; while('\0' != *str) { str++; i=i+1; } // printf("\n%d\n",i); i=i/2; // printf("\n%d\n",i); while(0 !=i) { str--; *Temp=*chTemp; *chTemp=*str; *str=*Temp; i--; chTemp++; } chTemp++; } int main(int argc,char *argv[]) { char str1[]="abcdefg"; char *pstr=str1; printf("%s",pstr); InvertStr(pstr); printf("%s",pstr); getch(); }

  

   其实,我学习C语言的历史是已经很长了,大一的时候学C, 大学四年, 工作两年多,算起来学习C语言的历史有六年了,虽然自己学习C语言

时间够长,但是我自己的C语言水平一直徘徊在入门级的门外;说个值得自己王婆自卖自夸的事情,那就是大学C语言考试得了个96分,嘿嘿......

面试题一:

     编写一个函数将一个字符串倒置,即将“abc”变为“cba”。

分析:

     这样的问题显然涉及到char型指针的运算。

Exp:

    void InvertStr(char *str)

    {

         long int i=0;    //估计这么长的字符串应该够用了,如果实在不行只能用float的数据来试验了。

        char *head;

        char *chTemp;

        if(NULL == str)

          {

               return ;

          }

          head=str;

          chTemp=str;

         while('\0' != *str)

             {

                  str++;

                  i=i+1;

               }

          while(0 != i)

            {

                str--;

                *chtemp=*str;

                 i--;

                chTemp++;

             }

          chTemp++;

         *chTemp='\0';

         str=head;

    }

面试题二:

      请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。

分析:

     假设数是:0000_0001; 当这个数被解释为无符号数的时候,如果对2求模,那么得到的结果是多少呢?

很显然得到的结果是1; 而如果是0000_0010,这个怎么样呢? 对2求模得到的是0; 但是如果我们往右进行

移位的话,那么结果是什么呢?

Exp:

实现一:

     unsigned short  CalSetBitNum(const unsigned char input)

     {

          short   i=0;

          short   j;

          unsigned char chTemp;

         chTemp=input;

           for(j=0 ;j<7;j++)

             {

                    i=i+ chTemp % 2;

                    chTemp=chTemp>>1; 

              }

            return  i ;

      }

实现二:可以利用按位与进行判定

unsigned short  CalSetBitNum(const unsigned char input)

     {

          short   i=0;

          short   j;

           short iTemp=input;

           for(j=0 ;j<7;j++)

             {

                    if((iTemp= iTemp >>1) & (0x01) )

                               i++; 

              }

            return  i ;

      }

其实第二种方法可以更简单, 大家看看怎么个简单法 ?

有的人可能会用第三种方法:进行与0相与。我认为这样严格来说不能算第三种方法,我认为那只是第二种方法的延伸而已。

面试题三:

          请编写一个 函数,该函数将给定的一个字符串转换成整数。

分析:

       将字符串转换成整数,那么我们需要进行的工作是将字符串一个字符一个字符的剥离出来,然后才能进行数据的转换,

这个其实也和scanf函数一样,因为在scanf函数读入的是文本流,就是将读入的字符都认为是字符,即使输入的是123,同样也

需要进行转换。

Exp:

     我们姑且简单的将字符串认为会转化为正整数,负数的留给大家讨论吧。并且认为如果输入的字符串是“123”,那么输出的应该也是

123(int型)。

     unsigned  int  StrToInt(const  char * source)

      {

          unsigned int i;

          unsigned int j;

          char *pTemp;

          if(NULL==source)

              {

                return 0;

              }  

           while('\0' != *pTemp)

             {

              j= *pTemp - 48;

              i=j+i*10;

              pTemp++;

              }

          return i;

      }

面试题四:

      请编写一个 函数,该函数将给定的一个整数转换成字符串。

分析:

      这个题目和上面的题目的问题刚好相反,因此可以借鉴上面题目的处理方法来进行处理。

      void IntToStr(const int source,char *target)

      {

          int i;

          int j;

          if(0==source)

              *target=‘\0’;

          i=source;

          do

          {

              j=i % 10; 

              *target=j+48; 

              target++;

           }while(0 != (i=i/10) )

        InvertStr(target);

      }

    以后会不定期的对C的面试题进行解读,希望借此可以增加自己的见识,也能提高自己的C水平........

     

posted on 2011-06-15 22:32  volcanol  阅读(2686)  评论(10编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。