嵌入式学习小组
直播中

王桂英

7年用户 1311经验值
私信 关注

嵌入式软件开发字符串拷贝函数strcpy该如何去实现呢

嵌入式软件开发字符串拷贝函数strcpy该如何去实现呢?
判断嵌入式软件开发内存存储大端小端的程序该如何去实现呢?

回帖(1)

刘秀兰

2021-12-24 17:03:57
1、冒泡排序:

void BubbleSort(int arr[], int len)
{
        for (int i = 0; i < len-1; i++)
        {
                for (int j = 0; j < len - 1 - i; j++)
                {
                        if (arr[j] > arr[j+1])
                        {
                                Swap(&arr[j], &arr[j+1]);
                        }
                }
        }
}


2、字符串拷贝函数strcpy实现:

char * strcpy(char * dest,const char * src)
{
        if((dest==NULL) || (src==NULL))
                return NULL;
               
        char * tmpdest=dest;//保存目标字符串首地址
        const char * tmpsrc=src;
        while((*tmpdest++ = *tmpsrc++) != '');//把src地址开始的字符串复制到dest开始的字符串中
                return dest;//返回目标字符串的地址
}


3、反转字符串strcpy实现:

char *revstr(char* str)
{
        char *start=str;//start指向字符串的开始位置
        char *end=str+strlen(str)-1;//end指向字符串的结束位置
        char tmp;


        if(str != NULL)
        {
                while(start < end)//字符串是奇数时候,start会出现等于end,该位置不用交换
                {
                        tmp = *start;
                        *start++ = *end;//*start++,它的运算顺序是先返回 *start的值,然后start再++。
                        *end-- = tmp;//*end--,它的运算顺序是先返回 *end的值,然后end再--。
                }
                return start;
        }       
}


4、判断内存存储大端小端的程序:

int function()
{
        union test
        {
                int i;
                char c;
        }tt; //定义一个有两个数据项的联合体,特征就是任何一个元素均是从联合体的基地址开始存储或保存
        tt.i=1;
        return (tt.c==1);//返回真则为小端模式,返回假则为大端模式
}


5、要求输入一个整数n,(n<=39) ,请你输出斐波那契数列(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946…)的第n项(从0开始,第0项为0):

//递归版:
int Fib(int n)
{
        if (n<=0)
                return 0;
        else if (n==1 || n==2)
                return 1;
        else
                return Fib(n-1)+Fib(n-2);  
}
//动态规划版:
int Fib(int n)
{
        if(n <=0 )
                return 0;
        int first=1;
        int second=1;
        while(--n > 1)
        {
                second=first+second;
                first=second-first;
        }
        return second;
}


6、设置绝对地址0x45a8的整形变量的值为0x55aa:

int* p;
p=(int *)0x45a8;
*p=0x55aa;


7、实现函数,输入一个整数,输出该二进制表示中1的个数,例如,把9表示成二进制是1001,有2位是1,因此输出是2:

//思路:把一个整数减1,将得到的整数与原来的整数做 位与 运算,会把该整数最右边的1变成0,
//依次循环,直到整数中所有的1变成0循环结束。则循环执行的次数就是该整数的二进制数中包含的1的个数。
//如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,
//原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
//例如:10010000 ----> 10001111
int Numberof1(int n)
{
    int count=0;
    while(n!=0)
    {
        ++count;
        n = n & (n-1);
    }
    return count;
}


8、从键盘输入一个4位数正整数a,使用int进行存储,将该数反序输出到另一个int型变量b中(过程中不使用字符串操作)。例如,若输入的是1357,则输出的是7531。

#include
void main()
{
        int a, b = 0;
        printf("请输入一个四位整数:");
        scanf("%d", &a);
        while (a)
        {
                b *= 10;//每次将b乘以10     0,7,70,750,7530
                b += a % 10;//对输入数取余数,即最后一个数7,将该数与输出数相加,b的第一个数是7,75,753,7531
                a /= 10;//取余后,将输入数除以10取整数,即拿到去掉最后一个数的数字135,13,1,0
        }
        printf("倒序后为:%dn", b);
        system("pause");
}


9、遍历单链表中确定值最大的点

int GetMax(LinkList L)
{
        if(L->next == NULL)
                return NULL;
        LNode *pmax,*p;
        pmax=L->next;//假定第一个节点中数据最大
        p=L->next->next;
        while(p)
        {
                if(p->data > pmax->data)
                pmax=p;//若p值大于max值,则重新赋值
                p=p->next;//遍历链表
        }
        return pmax->data;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分