嵌入式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++;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值