第八,九章

这一章主要讲了字符串操作库函数 其中以前没太知道的strtok字符串分隔函数(很有用。) strchr(查找第一个字符出现的位置) strncat,strncpy等等。

然后介绍了指针 (包括了void*指针(以前我都不知道有着玩意。。超级有用)指向函数的指针(以前觉得根本没啥用。。现在发现真是有大用处。。都想看看侯杰的书,自己实现一部分STL的功能了。。))

还有memset为什么不能赋值整数。。写了一部分习题之后才明白 memset的实现是按字节赋值的。。整数是4个字节的。。

学的东西还是非常有用的 。 真的补充了不少以前没学好和没注意到的知识点。

贴几个比较有意思的习题 

/* 描述
填写内存交换函数 SwapMemory,使得程序输出指定结果
*/
#include <iostream>
using namespace std;
void SwapMemory(void * m1, void * m2, int size)
{
	char* p = new char;
	for (int i = 0; i < size; i++) {
		*p = *((char*)m1+i);
		*((char*)m1 + i) = *((char*)m2 + i);
		*((char*)m2 + i) = *p;
	}
}

void PrintIntArray(int * a, int n)
{
	for (int i = 0; i < n; ++i)
		cout << a[i] << ",";
	cout << endl;
}

int main()
{
	int a[5] = { 1,2,3,4,5 };
	int b[5] = { 10,20,30,40,50 };
	SwapMemory(a, b, 5 * sizeof(int));
	PrintIntArray(a, 5);
	PrintIntArray(b, 5);
	char s1[] = "12345";
	char s2[] = "abcde";
	SwapMemory(s1, s2, 5);
	cout << s1 << endl;
	cout << s2 << endl;
	return 0;
}


/*
  6:指针练习:Memcpy之二
  此题要求完成任意类型的变量之间的拷贝(而且变量之间有可能共占一片内存区域)
  我自己写的是开一个新的内存区域 先把一个变量内容拷贝过去 在拷贝到dest..
  后来发现有个更好的写法 就是比较ori 和 dest数组
  从而决定是从前往后还是从后往前拷贝
  贴自己的代码了。。
*/
#include <iostream>
using namespace std;
void Memcpy(void * src, void * dest, int size)
{
	char* a = (char*)malloc(size * sizeof(char));
	/* 防止院数组和目标内存有重叠 */
	for (int i = 0; i < size; i++) {
		a[i] = *((char*)src + i);
	}
	for (int i = 0; i < size; i++) {
		*((char*)dest + i) = a[i];
	}
	free(a);
}

void Print(int * p, int size)
{
	for (int i = 0; i < size; ++i)
		cout << p[i] << ",";
	cout << endl;
}

int main()
{
	int a[10];
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> a[i];
	int b[10] = { 0 };
	Memcpy(a, b, sizeof(a));
	Print(b, n);

	int c[10] = { 1,2,3,4,5,6,7,8,9,10 };
	Memcpy(c, c + 5, 5 * sizeof(int)); //将c的前一半拷贝到后一半 
	Print(c, 10);

	char s[10] = "123456789";
	Memcpy(s + 2, s + 4, 5); //将s[2]开始的5个字符拷贝到s[4]开始的地方 
	cout << s << endl;

	char s1[10] = "123456789";
	Memcpy(s1 + 5, s1 + 1, 4); //将s1[5]开始的4个字符拷贝到s1[1]开始的地方 
	cout << s1 << endl;


	return 0;
}

/*
  7:指针练习:MyMax
  编写一个 MyMax函数,可以用来求任何数组中的最大值 使得程序按要求输出(我只能说void*指针和指向函数的指针太强大了。。)
*/
#include <iostream>
using namespace std;
void* MyMax(void* a, int width, int len, int(*p)(void*, void*)) {
	char*q = (char*)a;
	void * Max;
	Max = a;
	for (; len--; q += width) {
		if (p(Max, q) < 0) {
			Max = q;
		}
	}
	return Max;
}
int Compare1(void * n1, void * n2)
{
	int * p1 = (int *)n1;
	int * p2 = (int *)n2;
	return ((*p1) % 10) - ((*p2) % 10);
}
int Compare2(void * n1, void * n2)
{
	int * p1 = (int *)n1;
	int * p2 = (int *)n2;
	return *p1 - *p2;
}
#define eps 1e-6
int	Compare3(void * n1, void * n2)
{
	float * p1 = (float *)n1;
	float * p2 = (float *)n2;
	if (*p1 - *p2 > eps)
		return 1;
	else if (*p2 - *p1 > eps)
		return -1;
	else
		return 0;
}

int main()
{
	int t;
	int a[10];
	float d[10];
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		for (int i = 0; i < n; ++i)
			cin >> a[i];
		for (int i = 0; i < n; ++i)
			cin >> d[i];
		int * p = (int *)MyMax(a, sizeof(int), n, Compare1);
		cout << *p << endl;
		p = (int *)MyMax(a, sizeof(int), n, Compare2);
		cout << *p << endl;
		float * pd = (float *)MyMax(d, sizeof(float), n, Compare3);
		cout << *pd << endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值