c++课后作业

把字符串转换为整数

cpp 复制代码
int main()
{
	char pn[21];
	cout << "请输入一个由数字组成的字符串: ";
	cin >> pn;
	int last = 0;
	int res[10];
	int j = strlen(pn);
	int idx = 2;
	cout << "请选择(2-二进制,10-十进制): ";
	cin >> idx;
	for (int i = 0,len = strlen(pn);i < len; i++)
	{
		if (pn[i] < '0' || pn[i] > '9') { cout << "非法字符!!!"; break; }
		last += (pn[i] - '0') * pow(idx,j-1);
		j = j - 1 ;
	}
	cout << last;
}

重写strcat和strncat

cpp 复制代码
char* mystrcat(char* dest, const char* src)
{
    memcpy(dest + strlen(dest), src, strlen(src) + 1);

    return dest;
}


char* mystrncat(char* dest, const char* src, const size_t n)
{
    size_t len = strlen(dest);

    memcpy(dest + len, src, n);
    

    *(dest + len + n) = 0;


    return dest;

}

重写strchr和strrchr

注意⚠️:这里不能从后往前找,因为想从后往前找就只能使用strlen,而strlen本质就是遍历一遍字符串,这样就更慢了。

cpp 复制代码
const char* mystrchr(const char* s, int c)
{
    char* p = (char*)s;

    while (*p)
    {
        if (*p == c) return p;
        p++;
    }
    return 0;
}

const char* mystrrchr(const char* s, int c) //查找字符
{
    char* p = (char*)s;
    char* p1 = 0;
    while (*p)
    {
        if (*p == c)
        {
            p1 = p;
        }
        p++;
    }
    return p1;
   
}

重写strcmp和strncmp

cpp 复制代码
int mystrcmp(const char* str1, const char* str2)
{
    char* p1 = (char*)str1;
    char* p2 = (char*)str2;

    while (*p1 && *p2)
    {
        if (*p1 != *p2)
        {
            if (*(p1) > *(p2)) return -1;
            else return 1;
        }
        p1++;
        p2++;
    }
    return 0;
}


int mystrncmp(const char* str1, const char* str2, size_t n)
{
    char* p1 = (char*)str1;
    char* p2 = (char*)str2;
    
    for (int i = 0; i < n; i++)
    {
        if (*p1 != *p2)
        {
            if (*(p1) > *(p2)) return -1;
            else return 1;
        }
        p1++;
        p2++;
    }
    return 0;
   
}

重写strstr

cpp 复制代码
char* caijimystrstr(const char* haystack, const char* needle)
{
    char* p1 = (char*)haystack;
    char* p2 = (char*)needle;
    char* tmp1;
    char* tmp2 = p2;
    while (*p1)
    {
        while (*p1 == *p2)
        {
            tmp1 = p1;


            for (int i = 0; i < strlen(needle); i++)
            {
               
                if (*p1 != *p2)
                {
                    continue;
                }
                p1++;
                p2++;
                if (*p2 == 0)
                {
                    return p1-strlen(needle);
                }
            }
            
            continue;
      
        }
        p2 = tmp2;
        p1++;

        
    }
    return nullptr;

}




const char* dalaomystrstr(const char* haystack, const char* needle)
{
    size_t ii = 0, jj = 0; 
    size_t len = strlen(haystack), slen = strlen(needle);

    while ((ii < len) && (jj < slen))
    {
        if (haystack[ii] == needle[jj])
        {
            ii++, jj++;
        }
        else
        {
            ii = ii - jj;
            jj = 0;
            ii++;
        }
    }
    if (jj == slen) return (haystack+(ii-jj));
    return 0;
}

解析XML

cpp 复制代码
bool xmlbuffer(const char* xmlbuf, const char* fieldname, char* value = 0, const size_t ilen = 0)
{
    if (xmlbuf == 0 || fieldname == 0) return false;

    //创建字段
    int lenfieldname = strlen(fieldname);
    //开辟空间
    char* sfieldname = new char[lenfieldname + 3];
    char* efieldname = new char[lenfieldname + 4];
    //初始化
    memset(sfieldname, 0, lenfieldname +3);  // 错误代码 memset(sfieldname, 0, sfieldname); 原因:new出来的空间不能用memset
    memset(efieldname, 0, lenfieldname +4);
    //创建字段
    strcpy(sfieldname, "<"); strcat(sfieldname, fieldname); strcat(sfieldname,">");
    strcpy(efieldname, "</"); strcat(efieldname, fieldname); strcat(efieldname, ">");

    //找字段;
    char* start;
    char* end;
    start = (char*)strstr(xmlbuf, sfieldname);
    end = (char*)strstr(xmlbuf, efieldname);
    //没找到
    if (start == 0 || end == 0)
    {
        delete[] sfieldname;
        delete[] efieldname;
        return 0;
    }
    
    size_t vallen = (end - start - lenfieldname - 2);  //指针减去指针等于数值,表示的是从 start 到 end 的距离减去了 lenfieldname(<fieldname> 的长度)和 2(< 和 > 的长度)。
    
    if (ilen == 0)
    {
        
        strncpy(value, start + lenfieldname + 2, vallen);

        value[vallen] = 0;
    }
    else if (vallen <= ilen)
    {
        strncpy(value, start + lenfieldname + 2, vallen);

        value[vallen] = 0;
    }
    else
    {
        strncpy(value, start + lenfieldname + 2, ilen);

        value[ilen] = 0;

    }

    delete[] sfieldname;
    delete[] efieldname;
    return 1;

}

不重复的随机数

cpp 复制代码
void rrand(int arr[], const size_t len, const int minvalue = 0)
{
    srand(time(0));
    for (int i = 0; i < len; i++)
    {
        while (1)
        {
            int tmp = rand() % len + minvalue;

            int j = 0;

            for (j = 0; j < i; j++)
            {
                if (tmp == arr[j]) break;
            }

            if (j == i)
            {
                arr[i] = tmp;
                break;
            }

        }
    }
}

重写strcpy和strncpy

cpp 复制代码
char* my2strcpy(char* dest, const char* src)
{
    int i = 0;
    while (src[i])
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = 0;
    return dest;
}

char* my2strncpy(char* dest, const char* src , const size_t n )
{
    if (n < 0) return 0;

    size_t lens = strlen(src);

    if (n > lens)
    {
        my2strcpy(dest, src);
    }

    int i = 0;
    for (i = 0; i < n; i++)
    {
        dest[i] = src[i];
    }
    dest[i++] = 0;

    return dest;

}
相关推荐
SpongeG31 分钟前
数据结构第三周做题总结_链表
数据结构·算法·链表
everyStudy33 分钟前
前端五种排序
前端·算法·排序算法
未来可期LJ2 小时前
【C++ 设计模式】单例模式的两种懒汉式和饿汉式
c++·单例模式·设计模式
Trouvaille ~2 小时前
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
c++·c++20·编译原理·编译器·类和对象·rvo·nrvo
little redcap3 小时前
第十九次CCF计算机软件能力认证-乔乔和牛牛逛超市
数据结构·c++·算法
机器视觉知识推荐、就业指导3 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
muyierfly3 小时前
34.贪心算法1
算法·贪心算法
孤寂大仙v3 小时前
【C++】STL----list常见用法
开发语言·c++·list
咩咩大主教4 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
luthane5 小时前
python 实现average mean平均数算法
开发语言·python·算法