C語言面試題分類->字符串處理

1.strlen:計算字符串長度(不包含'\0')

實現想法:遍歷字符串,直到'\0'結束數組

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
//指針法
unsigned int mystrlenaddr(const char * str)  //爲何使用const char,咱們只計數不對原數據進行改變
{
        int length = 0;  //長度初始化爲0
        while (*str++)
        {
                length++;
        }
        return length;
}
 
 
void main()
{
        char * str = "fengcong is fucking too handsome";  //32個
        //printf("%d\n", strlen(str));
        printf("%d\n", mystrlenaddr(str));
 
        system("pause");
}

2.strcmp:比較字符串大小(通常用於字符串排序)

實現想法:依次從字符串開始一直找到不一樣的那個字符進行比較,得出大小測試

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
 
//掌握指針法
int mystrcmp(char const * str1, const char * str2)
{
        while (*str1 == *str2 && *str1 != '0')  //一直找到兩個字符串不一樣的地方
        {
                str1++;
                str2++;
        }
        if (*str1 > *str2)
                return 1;
        else if (*str1 < *str2)
                return -1;
        else
                return 0;
}
 
void main()
{
        char * str = "feng1";
        char * str1 = "feng2";
 
        //printf("%d\n", strcmp(str, str1));
 
        printf("%d\n", mystrcmp(str, str1));
 
 
        system("pause");
}

3.strcpy:用於字符串複製(複製包含'\0')

實現想法:一直複製到'\0'結束spa

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
//指針法
char * mystrcpyaddr(char * dest, const char * source)
{
        if (dest == NULL || source == NULL)
        {
                return NULL;   //若是目的操做或者源爲空,那麼久直接返回
        }
 
        while (*dest++ = *source++)  //裝X寫法
                ;
        return dest;
}
 
//下標法
char * mystrcpyindex(char * dest, const char * source)
{
        if (dest == NULL || source == NULL)
        {
                return NULL;   //若是目的操做或者源爲空,那麼久直接返回
        }
        int i = 0;
        while (source != '\0')
        {
                dest = source;
                i++;
        }
        dest = source; //由於要把最後的\0拷貝過去
        return dest;
}
 
void main()
{
        char * str = "fengcong is fucking too handsome";
        char str1[100]; //目的字符數組
        //strcpy(str1, str);
        //printf("%s\n", str1);
        mystrcpyindex(str1, str);
        printf("%s\n", str1);
 
 
        system("pause");
}

4.strstr:尋找母串中是否存在某個子串(稍難)

實現想法:依次比對指針

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
//下標 法
char * mystrstrindex(char * const momstr, const char * const sonstr)//前者指針指向的數據可變,可是指針不可變,後者都不可變
{
        int momlen = strlen(momstr); //母串的長度
        int sonlen = strlen(sonstr); //子串的長度
 
        for (int i = 0; i < (momlen - sonlen); i++)  //從0開始循環母串,到momlen-sonlen中止
        { 
                int flag = 1;
                for (int j = 0; j < sonlen; j++)
                {
 
                        if (momstr[i + j] != sonstr[j])
                        {
                                flag = 0;
                                break;  //若是出現不相等就 退出循環,繼續從下面一個尋找
                        }
                }
                if (flag)
                {
                        return (&momstr);
                }
        }
        return NULL;
}
 
//指針法
char * mystrstraddr(char * const momstr, const char * const sonstr)
{
        char * mstr = momstr;  //母串
 
        while (*mstr)
        {
                char * sstr = sonstr;  //子串
                char * momnowstr = mstr;  //記錄如今母串的位置
                int flag = 1;
                while (*sstr != 0)
                {
                        if (*sstr != *momnowstr || *momnowstr == '0')
                        {
                                flag = 0;
                                break;
                        }
                        momnowstr++;
                        sstr++;
                }
                if (flag)
                {
                        return mstr;
                }
                 
                mstr++; //母串對比位置+1
        }
        return NULL;
}
 
void main()
{
        char * str = "fengcong is too fucking handsome";
        //printf("%p", strstr(str, "fengcong"));
        //printf("%p", mystrstrindex(str, "engcong"));
        printf("%p", mystrstraddr(str, "some"));
 
        system("pause");
}


5.itoa:整數轉字符串code

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
char * myitoa(int value, char * str)
{
        char * pstr = str; //str自己不能改變,一會要返回str
        if (value < 0)
        {
                *pstr = '-';
                pstr++;
                value *= -1; //轉變爲正數處理
        }
        int wei = 1;  //數至少一位
        int ivalue = value; //用於測試長度
        while ((ivalue /=   10) != 0)
        {
                wei++;
        }
 
        pstr += wei-1;
        while (value % 10 != 0)
        {
                *pstr-- = (value % 10)+'0';
                value /= 10;
        }
        return str;
}
 
void main()
{
        int num = -45644;
        char str[20] = { 0 };
 
        printf("%s", myitoa(num, str));
 
 
 
        system("pause");
}

6.atoi:字符串轉整數(遇到非數字字符結束)blog

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
int myatoi(const char * str)
{
        if (str == NULL)
        {
                return 0;  
        }
        int num = 0; //須要返回的值
        int flag = 1; //記錄正負號
        if (*str == '-')
        {
                flag = -1;
                str++;
        }
        else if (*str == '+')
        {
                str++;
        }
 
        while (*str >= '0' && *str <= '9')
        {
                num= (num * 10 + (*str - '0'));
                str++;
        }
 
        return num*flag;
}
 
void main()
{
        char str[20] = "-57124";
        int num = 0;
 
        printf("%d\n",myatoi(str));
 
 
 
        system("pause");
}

7.memcpy:拷貝某段內存排序

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
//下標法
void * mymemcpybyindex(void * dest, const void * sor, size_t len)
{
        if (dest == NULL || sor == NULL)
        {
                return NULL;
        }
        for (int i = 0; i < len; i++)
        {
                ((char*)dest) = ((char*)sor);
        }
        return dest;
}
//指針法
void * mymemcpybyaddr(void * dest, const void * sor, size_t len)
{
        if (dest == NULL || sor == NULL)
        {
                return NULL;
        }
        char * pdest = dest;
        char * psor = sor;
        char * plast = (char * )sor + len;
        while (psor < plast)
        {
                *pdest++ = *psor++;
 
        }
        return dest;
}
 
void main()
{
        char str[50] = "fengcong is fucking too handsome";
        char * pstr = (char[50]) { 0 };  //在棧上開闢一段內存
 
        //printf("%s\n", memcpy(pstr, str, 32));
        printf("%s\n", mymemcpybyaddr(pstr, str, 31));
 
 
        system("pause");
}

8.memset:對指定內存每一個字節賦某個值內存

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
 
//下標法
void * mymemsetbyindex(void * dest, int val, size_t len)
{
        if (dest == NULL)
        {
                return NULL;
        }
        if (len == 0)
        {
                return dest;
        }
        char * p = dest;
        for (int i = 0; i < len; i++)
        {
                p = val;
        }
        return dest;
}
 
//指針法
void * mymemsetbyaddr(void * dest, int val, size_t len)
{
        if (dest == NULL)
        {
                return NULL;
        }
        if (len == 0)
        {
                return dest;
        }
        char * p = dest;
        char * plast = p + len;
        while (p < plast)
        {
                *p++ = val;
        }
        return dest;
}
 
void main()
{
        char str[50] = "fengcong is fucking too handsome";
        //printf("%s\n", memset(str, 65, 8));
        printf("%s\n", mymemsetbyaddr(str, 65, 8));
        system("pause");
}

9.memmove:和memcpy相似,可是memmove採用了中間空間,memcpy是直接拷貝

二者區別之處在於當拷貝地址重複的時候,結果不同(比較代碼可知)字符串

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
char * myftoa(double db, char * str)
{
        char * pstr = str;
        //先判斷 符號位
        if (db < 0)
        {
                *pstr = '-';
                db *= -1;  //轉爲正數處理
                pstr++;
        }
        //整數部分
        int zhengshu = (int)db;
        int izhengshu = zhengshu; //犧牲於記錄整數長度
        int wei = 1;  //整數部分至少一位
        while ((izhengshu /= 10) != 0)
        {
                wei++;
        }
        pstr += wei - 1;
        for (int i = 0; i < wei; i++)
        {
                *pstr-- = zhengshu % 10 + '0';
                zhengshu /= 10;
        }
        pstr += (wei+1);
        *pstr = '.';
        pstr++;
        //小數部分
        double xiaoshu = db - (int)db;
        for (int i = 0; i < 6; i++)
        {
                *pstr++ = (int)(xiaoshu * 10) + '0';
                xiaoshu = xiaoshu * 10 - (int)(xiaoshu * 10);
        }
        return str;
}
 
void main()
{
        double db = -2.11;
        char str[20] = { 0 };
        printf("%s\n", myftoa(db,str));
         
 
 
        system("pause");
}

10.memchr:某段內存中尋找某個值string

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
 
void * mymemchar(void * buf, int val, size_t size)
{
        if (buf == NULL)
        {
                return NULL;
        }
        char * p = buf;
        char plast = p + size;
        while (p < plast)
        {
                if (*p == val)
                {
                        return p;
                }
                p++;
        }
        return NULL;
}
 
void main()
{
        char str[50] = "fengcong is fucking too handsome";
        printf("%s\n", mymemchar(str, 'g', 8));
 
 
        system("pause");
}

11.memccpy:內存拷貝,直到一個值結束

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
//下標法
void * mymemccpybyindex(void * dest, const void * sor,int val, size_t len)
{
        if (dest == NULL || sor == NULL)
        {
                return NULL;
        }
        for (int i = 0; i < len; i++)
        {
                if( (((char*)dest) = ((char*)sor)) == val)
                        return dest;
        }
        return dest;
}
//指針法
void * mymemccpybyaddr(void * dest, const void * sor,int val, size_t len)
{
        if (dest == NULL || sor == NULL)
        {
                return NULL;
        }
        char * pdest = dest;
        char * psor = sor;
        char * plast = (char *)sor + len;
        while (psor < plast)
        {
                if ((*pdest++ = *psor++) == val)
                        return dest;
 
        }
        return dest;
}
 
void main()
{
        char str[50] = "fengcong is fucking too handsome";
        char * pstr = (char[50]) { 0 };  //在棧上開闢一段內存
        //printf("%s\n", memccpy(pstr,str,'s',32));
        printf("%s\n", mymemccpybyaddr(pstr, str, 'f', 32));
 
        system("pause");
}

12.memicmp:比較某段內存大小(一個字節一個字節比較,像strcmp)

注意:切不可用來比較整數,除非一字節整數,由於整數存儲方式是高位高字節

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
 
int mymemicmpbyaddr(const void * buf1, const void * buf2, size_t size)
{
        char * p1 = buf1;
        char * p2 = buf2;
        int i = 0;
        while(*p1 == *p2 && i < size)
        {
                p1++;
                p2++;
                i++;
        }
        if (*p1 > *p2)
        {
                return 1;
        }
        else if (*p1 < *p2)
                return -1;
        else
                return 0;
 
}
 
void main()
{
        char str[50] = "fengcong is fucking too handsome";
        char str1[50] = "fengfeng is fucking too handsome";
 
        printf("%d\n", mymemicmpbyaddr(str, str1, 32));
        system("pause");
}
相關文章
相關標籤/搜索