C/C++ 练习题及答案

这是一系列C/C++编程练习题目,包括指针操作、字符串处理、结构体、链表、操作符重载、文件读写等功能的实现。通过这些练习,可以提升C/C++编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

习题来自于互联网和书籍!

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';
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值