【C语言】练习题及答案(4月29号更新)

练习题及答案

【4月29号更新】(备忘)

//    day_19
//*****************
//模拟实现strcpy

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char*src)
{
    assert(dest && src);
    char* p = dest;

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

    return dest;
}

int main()
{
    char str[10];
    my_strcpy(str, "abcdef");
    printf("%s\n", str);

    return 0;
}

//4.模拟实现strcat

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
    assert(dest && src);
    char* str = dest;

    while(*str)
        str++;

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

    return dest;
}

int main()
{
    char str[8] = "hello ";
    my_strcat(str, "bit");
    printf("%s\n", str);

    return 0;
}

//模拟实现strchr

#include <stdio.h>
#include <assert.h>

char* my_strchr(const char* str, char ch) 
{
    assert(str);

    while(*str != ch && *str)
        str++;

    if(*str == ch) 
        return (char*)str;
    else
        return NULL;
}

int main()
{
    char str[] = "my name is LaoLi";
    printf("%s\n", my_strchr(str, 'L'));

    return 0;
}

//模拟实现strstr

include <stdio.h>
#include <assert.h>

char* my_strstr(const char* dest, const char* src)
{
    assert(dest && src);
    char* str = (char *)dest;
    char *s1, *s2;

    if(!*src)
        return (char *)dest;

    while(*str)
    {   
        s1 = str;
        s2 = (char *)src;

        while(*s1 && *s2 && (*s1 == *s2))
            s1++,s2++;

        if(!*s2)
            return str;

        str++;
    }   
}

//模拟实现strcmp

#include <stdio.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 && str2);

    while(*str1 && *str2 && !(*str1 - *str2))
        str1++,str2++;

    return *str1 - *str2;

}

//模拟实现memcpy

#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t n)
{
    assert(dest && src);
    char* str1 = (char *)dest;

    while(n--)
        *str1++ = *(char *)src,++(char *)src;

    return dest;
}

//模拟实现memmove

#include <stdio.h>
#include <assert.h>

void* my_memmove(void *dest, const void* src, size_t n)
{
    assert(dest && src);
    char *pdest = (char *)dest;

    if (pdest < src)
    {
        //dest<src     左->右
        while (n--)
        {
            *pdest = *(char *)src;
            ++pdest;
            ++(char *)src;
        }
    }
    else
        //dest>=src     右->左
        while (n--)
            *(pdest + n) = *((char *)src + n);

    return dest;
}

int main()
{
    char str[] = "memmove can be very useful......";
    my_memmove(str+20, str+15, 11);
    puts (str);
    return 0;
}

【4月27号更新】(备忘)

//    day_17
//*****************
//1.一个数组只有两个数字出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。

#include <stdio.h>
#include <assert.h>

void find_double(int *arr, int sz) 
{
    assert(arr);
    int *p1 = arr;
    int i = 0;
    int n = 0;

    for(i = 0; i < sz; i++)
    {   
        int j = 0;

        for(j = 0; j < sz; j++)
        {   
            if((i != j) && (arr[i] == p1[j]))
                break;
        }   
        if(j == sz) 
        {   
            int tmp = arr[n];
            arr[n] = arr[i];
            arr[i] = tmp;
            n++;
        }   
    }   
}

int main()
{
    int arr[10] = {1,15,26,35,15,48,26,48,26,26};
    int sz = sizeof(arr) / sizeof(arr[0]);

    find_double(arr, sz);
    printf("%d,%d\n", arr[0], arr[1]);

    return 0;
}

//2.喝汽水,1瓶汽水1元,两个空瓶可以换一瓶汽水,给20元,可以喝多少瓶汽水。编程实现。

#include <stdio.h>

#define MONEY 20

int main()
{
    int bottle = MOENY;
    int count = MONEY;
    int empty = 0;

    while(bottle / 2)
    {   
        empty = bottle % 2;
        bottle /= 2;
        count += bottle;
        bottle += empty;
    }   

    printf("%d\n", count);
    return 0;
}

//3.模拟实现strlen
//非递归

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
    int count = 0;
    assert(str);

    while(*str != '\0')
    {
        count++;
        str++;
    }

    return count;
}

int main()
{
    int ret = my_strlen("hello bit");
    printf("%d\n", ret);

    return 0;
}

//递归

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
    assert(str);
    if(*str)
        return 1 + my_strlen(str + 1); 
    else
        return 0;
}
int main()
{
    int ret = my_strlen("hello");
    printf("%d\n", ret);

    return 0;
}

//指针相减

#include <stdio.h>
#include <assert.h>

int my_strlen(const char* str)
{
    assert(str);
    const char* p = str;

    while(*p)
        p++;

    return p - str;
}

int main()
{
    int ret = my_strlen("hello ");
    printf("%d\n", ret);

    return 0;
}

//模拟实现strcpy

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char*src)
{
    assert(dest && src);
    char* p = dest;

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

    return dest;
}

int main()
{
    char str[10];
    my_strcpy(str, "abcdef");
    printf("%s\n", str);

    return 0;
}

//4.模拟实现strcat

#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
    assert(dest && src);
    char* str = dest;

    while(*str)
        str++;

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

    return dest;
}

int main()
{
    char str[8] = "hello ";
    my_strcat(str, "bit");
    printf("%s\n", str);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41866437/article/details/80108882