首页 > 其他分享 >strlen/strcpy/strncpy/strcat/strcmp/memset/memcmp不完成实现(部分函数跑过测试集)

strlen/strcpy/strncpy/strcat/strcmp/memset/memcmp不完成实现(部分函数跑过测试集)

时间:2024-07-03 12:57:37浏览次数:14  
标签:src ++ dst memset unsigned strcat char strcpy size

#include <klib.h>
#include <klib-macros.h>
#include <stdint.h>

#if !defined(__ISA_NATIVE__) || defined(__NATIVE_USE_KLIB__)

size_t strlen(const char *s) {
  // panic("Not implemented");
  assert(s != NULL);
  size_t l = 0;
  while(*s ++) {
    l ++;
  }
  return l;
}

char *strcpy(char *dst, const char *src) {
  // panic("Not implemented");
  if(dst == NULL || src == NULL) return NULL;
  // size_t l = strlen(dst);
  size_t l = sizeof(dst);
  char *tmp = dst;
  memset(dst, 0, l);
  while(*(unsigned char*)src != '\0' && l --) {
    *(unsigned char*)tmp = *(unsigned char*)src;
    tmp ++;
    src ++;
  }
  // + '\0'
  *(unsigned char*)tmp = '\0';
  return dst;
}



char *strncpy(char *dst, const char *src, size_t n) {
  // panic("Not implemented");
  if(dst == NULL || src == NULL) return NULL;
  size_t l1 = sizeof(dst);
  size_t l2 = sizeof(src);
  assert(l1 >= l2);
  assert(l1 >= n);
  assert(l2 >= n);
  size_t cnt = 0;
  char *tmp = dst;
  while(*(unsigned char*)src != '\0' && cnt < n) {
    *(unsigned char*)dst ++ = *(unsigned char*)src ++;
    cnt ++;
  }
  *(unsigned char*)dst = '\0';
  return tmp;
}

char *strcat(char *dst, const char *src) {
  // panic("Not implemented");
  if(dst == NULL || src == NULL) {
    return dst;
  }
  char *tmp = dst;
  size_t l = sizeof(dst);
  size_t lr = strlen(dst);
  size_t lc = l - lr + 1;
  while(*tmp != '\0' ) {
    tmp ++;
  }
  
  while(*src != '\0' && lc > 1) {
    *tmp = *src;
    tmp ++;
    src ++;
    // lc --;
  }
  *tmp = '\0';
  return dst;
}


int strcmp(const char *s1, const char *s2) {
  // panic("Not implemented");
  assert(s1 != NULL);
	assert(s2 != NULL);
  while(*(unsigned char*)s1 == *(unsigned char*)s2 && *(unsigned char*)s1 != '\0'){
    s1 ++;
    s2 ++;
  }
  return *(unsigned char*)s1 - *(unsigned char*)s2;
}


int strncmp(const char *s1, const char *s2, size_t n) {
  panic("Not implemented");
}

// void *memset(void *s, int c, size_t n) {
//   // panic("Not implemented");
//   void *tmp = s;
//   while(n --) {
//     *tmp++ = c;
//   }
//   return s;
// }

void *memset(void *s, int c, size_t n) {
  unsigned char *p = (unsigned char *)s;
  unsigned char uc = (unsigned char)c;
  
  while (n-- > 0) {
    *p++ = uc;
  }
  
  return s;
}

void *memmove(void *dst, const void *src, size_t n) {
  panic("Not implemented");
}

void *memcpy(void *out, const void *in, size_t n) {
  panic("Not implemented");
}

int memcmp(const void *s1, const void *s2, size_t n) {
  // panic("Not implemented");
  // can not operator on void pointer
  const unsigned char *su1 = s1;
  const unsigned char *su2 = s2;
  while((*su1 != '\0' || *su2 != '\0') && n --){
    if(*su1 == '\0')
    {
      if(*su1 == *su2) {
        su2 ++;
      }
      else break;
    }
    else if(*su2 == '\0'){
      if(*su1 == *su2) {
        su1 ++;
      }
      else break;
    }
  }

  return *su1 - *su2;
}

#endif

标签:src,++,dst,memset,unsigned,strcat,char,strcpy,size
From: https://www.cnblogs.com/seedlesscute-shadow/p/18281403

相关文章

  • memset函数
    转载:https://www.cnblogs.com/-wenli/p/11491127.htmlC语言memset函数详解memset()的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:#include<string.h>void*memset(void*s,intc......
  • strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟
    strcpy的使用和模拟(作用)将一个字符串的内容复制到另外一个字符串中代替掉。strcpy的使用效果#include<stdio.h>#include<string.h>intmain(){charstr1[]="Samplestring";charstr2[40];charstr3[40];strcpy(str2,str1);strcpy(str3,"copysucce......
  • strcpy()和memcpy()的区别
    strcpy()和memcpy()的区别strcpy()和memcpy()都是用来复制内存中的数据,但它们之间有一些重要的区别:strcpy():主要用于复制字符串数据。它会从源字符串的起始位置开始复制字符,直到遇到字符串结束符0为止。因此,strcpy()适合用于复制以0结尾的字符串。memcpy():用于复制一段内存......
  • 请简述strcpy和memcpy的区别
    请简述strcpy和memcpy的区别用途:strcpy:这是一个专门用于复制字符串的函数。它从源字符串(包括终止的空字符)开始,一直复制到目标字符串,直到遇到源字符串的终止空字符。memcpy:这是一个更通用的内存复制函数。它复制指定数量的字节从源地址到目标地址,而不考虑这些字节是否表示字符......
  • strcpy和memcpy的区别
    系统编程strcpy和memcpy的区别strcpy与memcpy都是标准C库函数①char*strcpy(char*dest,constchar*src);strcpy:字符串的复制and也会复制字符串的结束符。不需要指定长度,它遇到被复制字符的串结束符"\0"即结束,容易溢出。②voidmemcpy(void**dest,constvoid**sr......
  • strcpy函数和memcpy函数的区别
    strcpy和memcpy的区别1.复制内容:strcpy:专门用于复制字符串,它会一直复制直到遇到源字符串中的'\0'结束符。这意味着如果源字符串长度超过了目标缓冲区的大小(不包括'\0'),就会发生缓冲区溢出,这是一个常见的安全隐患。memcpy:可以复制任意内容,如字符数组、整型、结构体、类等。它按......
  • strcpy和memcpy
    strcpy和memcpy目录strcpy和memcpy复制内容:strcpy:专门用于复制字符串,它会一直复制直到遇到源字符串中的'\0'结束符。这意味着如果源字符串长度超过了目标缓冲区的大小(不包括'\0'),就会发生缓冲区溢出,这是一个常见的安全隐患。memcpy:可以复制任意内容,如字符数组、整型、结构体、......
  • strcat函数及其模拟实现(C语言)
    1.前言C语言中的库函数有很多,有关于处理字符串的函数有很多。在本文中,我将为大家介绍处理字符串较为常用的一个函数——strcat函数希望读者们能够好好看,大家一起进步!......
  • strcpy的模拟实现
        strcmp(arr1,arr2)是将arr2的内容拷贝到arr1当中。接下来我们来看看如何模拟实现:我们首先得创建一个函数,传入arr1与arr2当前的内容。assert保证函数的健壮性,以防传入的数组为空指针。再通过指针*arr2++=*arr1++,一个字节一个字节的传入,直到*arr2=0时结束循环,最终实......
  • strcat追加字符串以及其模拟实现
        如此处代码将arr2追加到arr1中的字符串后面。这样就要用两次循环达到字符串的效果,第一次循环是要找到arr1当中'\0'的位置,第二次循环就将src的字符串加入到dest斜杠0后的位置,直到*src==0,结束字符串的追加。#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#i......