这一章主要讲了字符串操作库函数 其中以前没太知道的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;
}