1. 程式人生 > 其它 >手撕字串操作函式

手撕字串操作函式

技術標籤:字串

字串複製函式strcpy

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

char* my_strcpy(char* srcString,char* desString)
{
   assert((srcString != NULL) && (desString != NULL));

   char* addr = desString;
   while((*desString++ = *srcString++) != '\0') ;

   return addr;
}

int main()
{
  char
* srcString = "abcdefghijklmnopqrstuvwxyz"; char desString[30]; printf("desString = %s \r\n", my_strcpy(srcString, desString)); }

改進字串複製函式strcpy

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

char* my_strcpy(char *dest, const char *src) {
    if (!
dest || !src) return NULL; char *d = dest; int size = strlen(src) + 1; if ((d > src) && (d < (src + size))) { d = d + size - 1; src = src + size - 1; while (size--) { *d-- = *src--; } } else { while (size--) { *
d++ = *src++; } } return dest; } int main() { char desString[30]; char srcString[] = "abcdefghijklmnopqrstuvwxyz"; printf("desString = %s \r\n", my_strcpy(desString, srcString)); printf("desString = %s \r\n", my_strcpy(&(srcString[5]), srcString)); return 0; }

取字串長度strlen

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

int my_strlen(char* String)
{
  assert(String != NULL);
  int i=0;
  while((*String++) != '\0') i++;

  return i;
}

int main()
{
  char* String = "abcdefghijklmnopqrstuvwxyz";
  printf("strlen(String) = %d \r\n", my_strlen(String));
  return 0;
}

整數轉字串itoa

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

char* my_itoa(int num,char* str,int radix)
{   /*索引表*/
    char index[]="0123456789ABCDEF";
    unsigned unum;/*中間變數*/
    int i=0,j,k;
    /*確定unum的值*/
    if(radix==10&&num<0)/*十進位制負數*/
    {
        unum=(unsigned)-num;
        str[i++]='-';
    }
    else unum=(unsigned)num;/*其他情況*/
    /*轉換*/
    do{
        str[i++]=index[unum%(unsigned)radix];
        unum/=radix;
    }while(unum);
    str[i]='\0';
    /*逆序*/
    if(str[0]=='-')
        k=1;/*十進位制負數*/
    else
        k=0;
     
    for(j=k;j<=(i-1)/2;j++)
    {   char temp;
        temp=str[j];
        str[j]=str[i-1+k-j];
        str[i-1+k-j]=temp;
    }
    return str;
}

int main()
{
  char* buf = malloc(50);

  memset(buf,0,50);
  printf("255 = %s \r\n",my_itoa(255,buf,16));

  memset(buf,0,50);
  printf("0xFF = %s \r\n",my_itoa(0xFF,buf,10));

  free(buf);
  return 0;
}

字串轉整數atoi

#include<stdio.h>

long int my_atoi(const char *nptr)
{
        int c;               /* current char */
        long int total;      /* current total */
        int sign;            /* if '-', then negative, otherwise positive */

        /* skip whitespace */
        while ((*nptr == ' ') || (*nptr == '\r') || (*nptr == '\n') || ( *nptr == '\v') || (*nptr == '\f') || (*nptr == '\t')){
           ++nptr;
        }            

        c = *nptr++;
        sign = c;           /* save sign indication */

        if (c == '-' || c == '+')
            c = *nptr++;    /* skip sign */

        total = 0;

        while ((c >= '0') && (c <= '9')) {
            total = 10 * total + (c - '0');     /* accumulate digit */
            c = *nptr++;                        /* get next char */
        }

        if (sign == '-')
            return -total;
        else
            return total;   /* return result, negated if necessary */
}

int main()
{
   char buf1[] = "0123456789";
   printf("buf1 = %ld \r\n", my_atoi(buf1));

   char buf2[] = "-9876543210";
   printf("buf2 = %ld \r\n", my_atoi(buf2));

   return 0;
}

字串拼接函式strcat

#include<stdio.h>

char* my_strcat(char* strDest, const char* strSrc)
{
   char *rem = strDest;
   while(*strDest) strDest++;

   while(*strSrc != '\0'){
       *strDest++ = *strSrc++;
   }
   *strDest = '\0';

   return rem;
}

int main()
{

  char desString[] = "hello ";
  char srcString[] = "world !\r\n";

  printf("%s",my_strcat(desString,srcString));
  return 0; 
}

字串比較strcmp

#include<stdio.h>

int my_strcmp(const char* str1,const char* str2) {
    while((*str1==*str2) && (*str1!='\0')){
        str1++;
        str2++;
    }
    return *str1-*str2;
}

int main()
{

  char str1[] = "helloa";
  char str2[] = "hellob";

  printf("return = %d \r\n",my_strcmp(str1,str2)); //return = -1
  return 0; 
}

在str1中查詢str2,並返回str2在str1中的起始位置後的所有字串 strstr

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

char* my_strstr(char *str1, char *str2) {
    if (str1 == NULL || str2 == NULL) return NULL;
    char *s = str1;
    if (*str2 == '\0') {
        return NULL;      //若str2為空,則直接返回空
    }
    while (*s != '\0') {  //若不為空,則進行查詢
        char *s1 = s;
        char *s2 = str2;
        while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
            s1++, s2++;
        }
        if (*s2 == '\0') {
            return s;     //若s2先結束
        }
        if (*s2 != '\0' && *s1 == '\0') {
            return NULL;  //若s1先結束而s2還沒結束,則返回空
        }
        s++;
    }
    return NULL;
}

int main()
{

  char str1[] = "hello world !\r\n";
  char str2[] = "llo";

  printf("%s",my_strstr(str1,str2));  //輸出: llo world !

  return 0;
}