嵌入式C常見筆試題:字符串

一.strcat、strcpy、strcmp、strlen函數的實現

  1. 1

    實現strcat函數

    格式:extern char *strcat(char *dest,char *src);

    功能:把src所指字符串添加到dest結尾處並添加'\0';

    返回:指向dest的指針。

    實現:

    char *Mystrcat(char*dest,const char*src)

    {

        char *mydest = dest;

        while ('\0' != *dest)

        {

            dest++;

        }

        while ('\0' !=(*dest++ = *src++))

        {

            NULL;

        }

        return mydest;

    }

  2. 2

    實現strcpy函數

    格式:extern char *strcpy(char *dest,char *src);

    功能:把src所指由NULL結束的字符串複製到dest所指的數組中。

    返回:指向dest的指針。

    char *mystrcpy(char *strDest, const char *src);

    {

        char *mydest = strDest;

     while(*strDest++ = *src++); 

     return mydest;

    }

      

  3. 3

    實現strcmp函數

    原型:extern int strcmp(char *str1,char * str2);

    功能:比較字符串s1和s2;

    返回:當s1<s2時,返回值<0

         當s1=s2時,返回值=0

         當s1>s2時,返回值>0。

    int mystrcmp(const char*str1,const char*str2)

    {

        while(*str1++==*str2++)

        {

            if(*str1=='\0')

            return 0;

        }

        return (*str1-*str2);

    }

  4. 4

    實現strlen函數

    原型:extern unsigned int strlen(char *s);

    功能:計算字符串s的(unsigned int型)長度;

    返回:返回s的長度(請注意是無符號整型),不包括結束符NULL。

    int mystrlen(const char *str)

    {

        int len = 0;

        while ('\0' != *str++)

        {

            len++;

        }

        return len;

    }

    OK,這裏補充一種方法,也是筆試常考的題目:不用中間變量,實現strlen

    int mystrlen(const char *str)

    {

        if ('\0'  == *str )

        {

            return 0;

        }

        return mystrlen(str+1)+1;

    }

    END

二.strcpy、strncpy、memcpy、memset

  1. 1

    strcpy解析

    extern char *strcpy(char *dest,char *src);

    1.strcpy只用於字符串的複製。

    2.strcpy會複製最後的結束符

    3.函數會一直拷貝字符串的內容,直到遇到‘\0’

  2. 2

    memcpy解析

    void  *memcpy(void *s1,  const void *s2,  size_t  n);

    1.內存複製

    2.對複製的內容沒有限制

    3.將一個大小爲n的內存段的值拷貝到另一內存段中

  3. 3

    strncpy解析

    char  *strncpy(char *s2, const char *s1, size_t n);

    1.該函數用於拷貝count個字符。

    2.調用完該函數後一定要加上一句:dst[count] = '/0';因爲可能拷貝的n個字符中,沒有‘\0’

  4. 4

    memset解析

    void *memset(void *s, int ch, size_t n);

    1.將s中前n個字節 用 ch 替換並返回 s。

    2.常用作字符串等清零。

    END

三.字符串逆序

  1. 1

    普通逆序

    char *reverse(char *s)

    {

        char *q = s;

        while (*q)

             q++;

        q -=1;

        char *p = (char *)malloc(sizeof(char)*(q-s+2));

        char *r = p;

        while (q >= s)

        {

             *p++ = *q--;

        }

        *p = '\0';

        return r;

    }

  2. 2

    在不允許分配額外的空間的情況下,完成字符串的逆序

    char *reverse(char *s)

    {

        char *p = NULL;

        char *q = NULL;

        char temp;

        p = q = s;

        

        while (*q)

        {

            q++;

        }

        q--;

       

        while (p < q)

        {

            temp = *p;

            *p = *q;

            *q = temp;

        }

        return s;

    }

  3. 3

    不允許有變量的逆序

    char *reverse(char *s)

    {

        char *p = NULL;

        char *q = NULL;

        p = q = s;

        

        while (*q)

        {

            q++;

        }

        q--;

       

        while (p < q)

        {

            *p = *p^*q;

            *q = *p ^ *q;

            *p = *p ^ *q;

            p++;q++;

        }

        return s;

    }

  4. 4

    按單詞逆序

    給定一個字符串,按單詞將該字符串逆序,比如給定"This is a sentence",則輸出是"sentence a is This",爲了簡化問題,字符串中不包含標點符號。

    1.按照單詞逆序:"sihT si a ecnetnes"

    2.按照句子逆序:"sentence a is This"

    void reverseword(char *p,char *q)

    {

        while (p < q)

        {

            *p = *p ^ *q;

            *q = *p ^ *q;

            *p = *p ^ *q;

            p++;

            q++;

        }

        return; 

    }

    char *reverse(char *s)

    {

        char *p = NULL;

        char *q = NULL;

        p = s;

        q = s;

        

        while (*q)

        { 

            if (' ' == *q)

            {

                reverseword(p,q);

                q++;

                p = q;

            }

            else

            {

                 q++;

            }

        }

        reverseword(p,q-1);

        reverseword(s,q-1);

    }

  5. 5

    遞歸實現反向輸出字符串

    void reverse(char *str)  

    {  

        if(*str != '/0')  

            reverse(str + 1);  

        printf("%c", *str);  

    }  

    END

四.其他常見字符串面試題

  1. 整數轉換爲字符串,並且不調用itoa

    1.整數的每一位加上‘0’轉換爲字符串

    2.將字符串翻轉

    int main(int argc,char **argv)

    {

        int num = 12345;

        char p[7];

        char q[7];

        int i = 0;

        int j = 0;

        while (num)

        {

            p[i] = num%10+'0';

            i++;

            num = num/10;

        }

        p[i]='\0';

        i--;

        while (i>=0)

        {

            q[j] = p[i];

            j++;

           i--;

        }

        q[j] = '\0';

    }

  2. 字符串轉換爲整數

    1.字符串減去‘0’就會隱性轉換爲int

    2.再乘以10累加法計算

    int main(int argc,char **argv)

    {

        int i = 0,sum = 0;

       

        char temp[7] = {'1','2','3','4','5','\0'};

        while (temp[i])

        {

            sum = sum*10 + (temp[i]- '0');

            i++;

        }

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章