嵌入式工程师面试_常见字符串类编程

1、将一个链表逆序

LinkList *reverse(LinkList *head)
{
  LinkList *p1,*p2 = NULL,*p3 = NULL;
  if(head == NULL || head->next == NULL)
    return head;
  p1 = head->next;
  while(p1!=NULL)
  {
    p3 = p1->next;
    p1->next = p2;
    p2 = p1;
    p1 = p3;
 }
 head->next = p2;
  // head = p2;


  return head; 
}
-----------------------------------------------------------------------
2、计算一个字节里(byte)里面有多少bit被置1  

#include <stdio.h>

int comb(const int c)
{
int count = 0;
int i = 0;
int cc = c;
while(i++<8)
{
    if((cc&1)==1)
    {
        count++;
    }
    cc = cc>>1;
}
return count;
}

int main()
{
const int c = 0xcf;
printf("%d\n",comb(c));
return 1;
}
---------------------------------------------------------------
3、在一个字符串中找到可能的最长的子字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *commanstring(char shortstring[],char longstring[])
{
  int i,j;
  char *substring = malloc(256);
  if(strstr(longstring,shortstring)!=NULL)
    return shortstring;
  for(i=strlen(shortstring)-1;i>0;i--)
  {
    for(j=0;j<=strlen(shortstring)-i;j++)
    {
      memcpy(substring,&shortstring[j],i);
    substring[i]='\0';
    if(strstr(longstring,substring)!=NULL)
      return substring;
    }
  }
  return NULL;
}

void main(void)
{
  char *str1 = "aocdfe";
  char *str2 = "pmcdfa";
  char *comman = NULL;
  if(strlen(str1)>strlen(str2))
    comman= commanstring(str2,str1);
  else
    comman = commanstring(str1,str2);
  printf("the longest comman string is:%s\n",comman);
  
 }
--------------------------------------------------------
4、字符串转换为整数  

#include <stdio.h>
#include <string.h>
void reverse(char s[])
{ //字符串反转

    int c, i=0, j;
    for(j=strlen(s)-1;i<j;j--)
    { c=s[i];
        s[i]=s[j];
        s[j]=c;
        i++;
    }
}
void IntegerToString(char s[],int n)
{ int i=0,sign;
    if((sign=n)<0)//如果是负数,先转成正数 

        n=-n;
    do //从个位开始变成字符,直到最高位,最后应该反转

    { s[i++]=n%10+'0';
    }while((n=n/10)>0);
    //如果是负数,补上负号

    if(sign<0)
        s[i++]='-';
    s[i]='\0';//字符串结束

    reverse(s);
}
void main()
{ int m;
    char c[100];
    m =215;
    IntegerToString(c,m);
    printf("integer = %d string = %s\n", m, c);
}
--------------------------------------------------------------------------
5、整数转换为字符串

#include <stdio.h>
#include <string.h>
int Atoi(char str[])
{
int i;
int weight = 1; // 权重

int rtn = 0; // 用作返回


for(i = strlen(str) - 1; i >= 0; i--)
{
   rtn += (str[i] - '0')* weight; //

   weight *= 10; // 增重

}

return rtn;
}

void main()
{
char str[32];

printf("Input a string :");
gets(str);

printf("%d\n", Atoi(str));
}
------------------------------------------------------------
6、将一个字符串逆序

#include <stdio.h>
#include <string.h>

char *strconv(char *p)
{
    int length = strlen(p);
char *ptr = p;
char *ptr_1 = p + length -1;
while(ptr < ptr_1)
{
char c = *ptr;
*ptr = *ptr_1;
*ptr_1 = c;
++ptr;
--ptr_1;
}
return p;
}
int main()
{
char str[]="abcdef1234";
char *p;
p = strconv(str);
printf("%s",p);
return 1;
}
--------------------------------------------------------------------

7、写出在母串中查找子串出现次数的代码

int count1(char* str,char* s)
{
    char* s1;
    char* s2;
    int count = 0;
    while(*str!='/0')
    {
        s1 = str;
        s2 = s;
        while(*s2 == *s1&&(*s2!='/0')&&(*s1!='0'))
        {
            s2++;
            s1++;
        }
        if(*s2 == '/0')
            count++;
        str++;
    }
    return count;
}
--------------------------------------------------------------------------------------

8、查找第一个匹配子串位置,如果返回的是s1长度len1表示没有找到

size_t find(char* s1,char* s2)
    {
        size_t i=0;
         size_t len1 = strlen(s1)
        size_t len2 = strlen(s2);
        if(len1-len2<0) return len1;
        for(;i<len1-len2;i++)
        {
            size_t m = i;
            for(size_t j=0;j<len2;j++)
            {
                if(s1[m]!=s2[j])
                    break;
                m++;
            }
            if(j==len)
                break;
        }
        return i<len1-len2?i:len1;
    }
-------------------------------------------------------------------------------------

9、实现strcpy函数

char *strcpy(char *destination, const char *source) 
{ 
    assert(destination!=NULL&&source!=NULL);
    char* target = destinaton;
    while(*destinaton++=*source++); 
    return target ; 
} 
-------------------------------------------------------------------------------------

10、实现strcmp函数

int strcmp11(char* l,char* r)
{
    assert(l!=0&&r!=0);
    while(*l == *r &&*l != '/0') l++,r++;
    if(*l > *r)
        return 1;
    else if(*l == *r)
        return 0;
    return -1;
}
--------------------------------------------------------------------------------------

11、实现字符串翻转

void reserve(char* str)
{
assert(str != NULL);
char * p1 = str;
char * p2 = str-1;
while(*++p2); //一般要求不能使用strlen
p2 -= 1;
while(p1<p2)
{
char c = *p1;
*p1++ = *p2;
*p2-- = c;
}
}
-----------------------------------------------------------------------------------------

12、用指针的方法,将字符串“ABCD1234efgh”前后对调显示

char str123[] = "ABCD1234efgh";
    char * p1 = str123;
    char * p2 = str123-1;
    while(*++p2);
    p2 -= 1;
    while(p1<p2)
    {
        char c = *p1;
        *p1++ = *p2;
        *p2-- = c;
    }
--------------------------------------------------------------------------------------------

13、给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"

#i nclude<stdio.h>
#i nclude<stdlib.h>
#i nclude<string.h>

char *commanstring(char shortstring[], char longstring[])
{
    int i, j;
    char *substring=malloc(256);
    if(strstr(longstring, shortstring)!=NULL)              //如果……,那么返回shortstring
        return shortstring; 

    for(i=strlen(shortstring)-1;i>0; i--)                 //否则,开始循环计算
    {
        for(j=0; j<=strlen(shortstring)-i; j++)
        {
            memcpy(substring, &shortstring[j], i);
            substring[i]='/0';
            if(strstr(longstring, substring)!=NULL)
            return substring;
        }
    }
    return NULL;
}


main()
{
    char *str1=malloc(256);
    char *str2=malloc(256);
    char *comman=NULL;

    gets(str1);
    gets(str2);

    if(strlen(str1)>strlen(str2))                         //将短的字符串放前面
        comman=commanstring(str2, str1);
    else
        comman=commanstring(str1, str2);

    printf("the longest comman string is: %s/n", comman);
}
-----------------------------------------------------------------------------------------------

14、判断一个字符串是不是回文

int IsReverseStr(char *str)
{
    int i,j;
    int found=1;
    if(str==NULL)
        return -1;
    char* p = str-1;
    while(*++p!= '/0');
    --p;
    while(*str==*p&&str<p) str++,p--;
    if(str < p)
        found = 0;
    return found;
}
-----------------------------------------------------------------------------------------------

15、写函数完成内存的拷贝

void* memcpy( void *dst, const void *src, unsigned int len )
{
    register char *d;
    register char *s;
    if (len == 0)
        return dst;
    if ( dst > src )   //考虑覆盖情况
    {
        d = (char *)dst + len - 1;
        s = (char *)src + len - 1;
        while ( len >= 4 )   //循环展开,提高执行效率
        {
            *d-- = *s--;
            *d-- = *s--;
            *d-- = *s--;
            *d-- = *s--;
            len -= 4;
        }
        while ( len-- ) 
        {
            *d-- = *s--;
        }
    } 
    else if ( dst < src ) 
    {
        d = (char *)dst;
        s = (char *)src;
        while ( len >= 4 )
        {
            *d++ = *s++;
            *d++ = *s++;
            *d++ = *s++;
            *d++ = *s++;
            len -= 4;
        }
        while ( len-- )
        {
            *d++ = *s++;
        }
    }
    return dst;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值