1. 写出String的具体实现

类的定义:

#include <iostream>
#include <cstring>
using namespace std; class String
{
friend ostream & operator<<(ostream &, const String &);
public:
String(const char *str = NULL);
String(const String &);
String & operator=(const String &);
~String();
private:
char *m_data;
};

类成员函数的实现:

String::~String()
{
if (m_data) delete[] m_data;
} String::String(const char *str)
{
if (str == NULL)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
m_data = new char[strlen(str)+1];
strcpy(m_data, str);
}
} String::String(const String &other)
{
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data, other.m_data);//String str;str.m_data;
} String & String::operator=(const String &other)
{
if (this == &other) return *this; delete[] m_data;
m_data = new char[strlen(other.m_data)+1];
strcpy(m_data, other.m_data);
return *this;
} ostream & operator<<(ostream &out, const String &s)
{
out << s.m_data;
return out;
} int main()
{
String str;
String str2("hello");
String str3(str2);
String str4 = str2; cout << str << "#" << endl;
cout << str2 << endl;
cout << str3 << endl;
cout << str4 << endl;
}

2. 编写一个标准strcpy函数

总分值为10,下面给出几个不同得分的答案

以下是2分程序片段:

void strcpy(char *dest, char *src)
{
while ((*dest++ = *src++) != '\0');
}

以下是4分程序片段:

//将源字符串加const
void strcpy(char *dest, const char *src)
{
while ((*dest++ = *src++) != '\0');
}

以下是7分程序片段:

//对源地址和目的地址加非NULL断言
void strcpy(char *dest, const char *src)
{
assert((dest != NULL) && (src != NULL));
while ((*dest++ = *src++) != '\0');
}

以下是10分程序片段:

//为了实现链式操作,将目的地址返回
char *strcpy(char *dest, const char *src)
{
assert((dest != NULL) && (src != NULL));
if (dest == src) return dest;
char *addr = dest;
while ((*dest++ = *src++) != '\0');
return addr;
}

可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!

读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了:

int strlen(const char *str)
{
assert(str != NULL);
int len = 0;
while (*str++ != '\0') len++;
return len;
}

函数strcmp的实现:

int strcmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
while (*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1 - *str2;
}

3. 文件中有一组整数,要求从小到大排序后输出到另一个文件中

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//simple bubble sort
void sort(vector<int> &data)
{
int temp, n = data.size();
for (int i = 1; i < n; i++)
for (int j = 0; j < n-i; j++)
if (data[j] > data[j+1])
{
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
} int main()
{
ifstream in(".\\data.txt");
if (!in)
{
cout << "open file error!" << endl;
exit(1);
} int temp;
vector<int> data;
while (!in.eof())
{
in >> temp;
data.push_back(temp);
}
in.close(); sort(data); ofstream out(".\\result.txt");
if (!out)
{
cout << "create file error!" << endl;
exit(1);
}
for (size_t i = 0; i < data.size(); i++)
out << data[i] << " ";
out.close();
}

4. 两个int型数据,不用任何的判断语句如 if、switch、?: 等,找出其中的大值

int max(int x, int y)
{
int buf[2] = {x, y};
unsigned int z = x - y;
z >>= 31;
return buf[z];
}

利用位运算,不过一个很大的正数和一个很小的负数比较可能会溢出。

C/C++一些库函数的实现的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  2. Linux系统调用和库函数调用的区别

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...

  3. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  4. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数

    前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...

  5. STM32库函数编程、Keli/MDK、stm32f103zet6

    catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...

  6. LPC1768/1769之CAN控制器概述(附库函数下载地址)

    一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...

  7. 如何快速上手使用STM32库函数

    一.背景 如前文所述,利用标准库函数的好处在于,可以快速开发,不用去对着数据手册,小心翼翼的一位一位的配置那些繁复的寄存器,因为这些工作意法半导体已经找了一些顶级的工程师帮你做了,杰作既是其库函数.当 ...

  8. 【XLL 框架库函数】 TempActiveRef/TempActiveRef12

    [XLL 框架库函数] TempActiveRef/TempActiveRef12 创建一个包含所有激活工作表引用区域 XLOPER/XLOPER12 LPXLOPER TempActiveRef(B ...

  9. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  10. C语言-两个库函数

    两个库函数 --1-- printf函数 1.1 printf 函数的介绍 1.2 格式控制字符串 1.3 %f输出精度的问题 1.4 printf 函数使用注意事项 --2-- scanf函数 2. ...

随机推荐

  1. make、makefile

    http://blog.csdn.net/wed110/article/details/34853475 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows ...

  2. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  3. Leetcode 54:Spiral Matrix 螺旋矩阵

    54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of t ...

  4. tensorflow 学习笔记-- tf.reduce_max、tf.sequence_mask

    1.tf.reduce_max函数的作用:计算张量的各个维度上的元素的最大值.例子: import tensorflow as tfmax_value = tf.reduce_max([1, 3, 2 ...

  5. 一键分享到QQ空间、QQ好友、新浪微博、微信代码

    通过qq空间.qq聊天.新浪微博和微信二维码分享平台提供的接口,实现把网页中对应的图片.标题.描述的信息参数用javascript获取后传进接口中,实现一键分享. 使用到的接口(测试时需要登录,网址和 ...

  6. vue 选项卡

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script sr ...

  7. UVa 548 树(已知其中两种遍历, 还原树)

    题意: 给出后序遍历和先序遍历, 还原一棵树, 然后求出从根节点到叶子的最小路劲和. 分析: 已知后序遍历, 那么后序的最后一个节点就是根节点, 然后在中序中找到这个节点, 它的左边就是左子树, 它的 ...

  8. 商业研究(21):活力蛙,足疗O2O,曾经的“中国上门足疗领先品牌”

    友情提示:商业研究系列文章,只探讨项目和相关项目的商业本身,不针对任何人和任何组织!!! 2015年,在京东-东家 股权众筹平台,参与投资了足疗O2O项目,活力蛙.     后来由于,股市大跌和资本寒 ...

  9. POJ-3692Kindergarten,求最大独立集!

    Kindergarten Time Limit: 2000MS   Memory Limit: 65536K       Description In a kindergarten, there ar ...

  10. Spark 动态(统一)内存管理模型

    作者编辑:王玮,胡玉林 一.回顾 在前面的一篇文章中我们介绍了spark静态内存管理模式以及相关知识https://blog.csdn.net/anitinaj/article/details/809 ...