习题来自于互联网和书籍!
1、利用指针编写交换两个整型变量值的函数。程序的运行结果如下:
输入:5,6 输出:6,5
注释:网上很多写法都是交换变量的内容,现在提供一个写法交换地址的。
#include <cstdlib>
#include <iostream>
int changeInt(int** source, int** dest)
{
int ret = 0;
if (source == nullptr || dest == nullptr)
{
ret = -1;
printf_s("Error: changeInt(int* source, int* dest) source == nullptr || dest == nullptr errCode:%d", ret);
return ret;
}
int*temp = *source;
*source = *dest;
*dest = temp;
return ret;
}
void main()
{
int a = 5, b = 6;
int* pa = &a; int* pb = &b;
printf_s("*pa = %d; *pb = %d \n", *pa, *pb);
int ret = changeInt(&pa, &pb);
if (ret == 0){
printf_s("*pa = %d; *pb = %d \n", *pa, *pb);
}
system("pause");
}
2、编写一个函数,输入一个字符串,然后将这个字符串反序输出。
输入:ABCDEF 输出:FEDCBA
//不改变源数组
int reverseString(const char* const source, char* dest)
{
int ret = 0;
if (source == nullptr || dest == nullptr)
{
ret = -1;
return ret;
}
const char* p = source;
//求出source的长度
int len = strlen(p);
//指向源数组尾元素
p = source + len - 1;
//指向目标数组头元素
char* pd = dest;
//递减源数组指针步长,并将值付给目标数组
while (len > 0)
{
*pd = *p;
pd++;
p--;
len--;
}
//最后要加上字符串结束符
*pd = '\0';
return ret;
}
//改变源数组
int reverseString2(char* source)
{
int ret = 0;
if (source == nullptr)
{
ret = -1;
return ret;
}
//指向数组头元素
char* p1 = source;
int len = strlen(source);
// 指向数组尾元素
char* p2 = source + len - 1;
//临时储存拷贝过来的值
char temp;
//每次增加P1,减少P2
while (p1 < p2)
{
temp = *p2;
*p2 = *p1;
*p1 = temp;
p1++;
p2--;
}
return ret;
}
void main()
{
//test reverseString
char source[10] = { "123456" };
char dest[10];
reverseString(source, dest);
printf_s("%s \n",dest);//654321
//test reverseString2
reverseString2(source);
printf_s("%s \n",source);//654321
system("pause");
}
3、替换字符串指定子字符串的内容。
输入:"xxxabcxxxabcxx" 替换abc 为 33333 输出:"xxx33333xxx33333xx"
//soure 源字符串
//subStr 要被替换的内容
//replaceStr 替换后的字符串
//dest 输出字符串
int replaceString(const char* const source, const char* const subStr, const char* const replaceStr, char* dest)
{
int ret = 0;
if (source == nullptr)
{
ret = -1;
return ret;
}
char *temp = dest;
char *pt = temp;
//先查找有没有subStr
const char* s = source;
const char* pFind = NULL;
//如果有则用dest替换掉subStr并将新字符串拷贝到temp空间中
do
{
//1、先检查是否找到指定值
pFind = strstr(s, subStr);
if (pFind == nullptr)
{
break;
}
//2、先pt指向到temp的最后面
pt = temp + strlen(temp);
//3、拷贝查找后之前的字符到临时空间
memcpy(pt, s, pFind - s);
//4、链接需要替换的字符
/*strcat_s(temp, 100, replaceStr);*///不能使用strcat_s,会添加一个'\0'
pt = temp + strlen(temp);//再次指到temp的末尾
memcpy(pt, replaceStr, strlen(replaceStr));//分配内存
//5、改变pf和s的值
pFind = pFind + strlen(subStr);
s = pFind;
} while (*s != '\0' && subStr != nullptr);
//6、链接尾字符
pt = temp + strlen(temp);//再次指到temp的末尾
memcpy(pt, s, source + strlen(source) - s);//分配内存
return ret;
}
void main()
{
char source[100] = "xxxabcxxxabcxx";
char dest1[100] = {0};
char dest2[100] = { 0 };
replaceString(source, "abc", "33333",dest1);
printf_s("%s\n", dest1);
replaceString(source, "abc", "z", dest2);
printf_s("%s\n", dest2);
/*char source[100] = "xxxabcxxxabcxx";
char temp[100] = { 0 };
memcpy(temp, source, 3);
printf_s("%s\n", temp);
memcpy(temp+strlen(temp), source + 3, 3);
printf_s("%s\n", temp);*/
system("pause");
4、去除字符串的首尾空白字符。
输入:" abc ", 输出:"abc"
//去除字符串首尾的空白字符(改变源字符串)
int trim(char* source)
{
int ret = 0;
if (source == nullptr || *source == '\0')
{
return ret;
}
//指向数组头元素
char* pb = source;
//指向数组尾元素(-1)是安全的,因为已经判断source不会为0
char* pe = source + strlen(source) - 1;
int len;
//从头开始检测遇到不是空格停下来
while (*pb == ' ' && *pb != '\0')
{
pb++;
}
//从尾开始检测遇到不是空格停下来
while (*pe == ' ' && pe != source)
{
pe--;
}
//如果全是空格就全部删除,否则拷贝不是空格的部分
if (pe < pb)
{
*source = '\0';
}