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';
	}
C++课后习题及答案 一、 选择填空 1. 下列各种高级语言中,( )是面向对象的程序设计语言。 A.BASIC; B.PASCAL; C.C++ D.Ada 2. 下列各种高级语言中,( )是最早提出了对象的概念。 A.Algol 60; B.Simula 67; C.Smalltalk; D.C++ 3. 下述面向对象抽象的原理中,( )是不对的。 A. 数据抽象; B. 行为共享; C.进化; D. 兼容; 4. ( )不是面向对象系统所包含的要数。 A. 重载; B. 对象; C. 类; D. 继承; 5. 关于C++与C语言的关系的描述中,( )是错误的。 A. C语言是C++的一个子集; B. C语言与C++是兼容的; C. C++对C语言进行了一些改进; D. C++和C语言都是面向对象的; 6. 下面关于对象概念的描述中,( )是错误的。 A.对象就是C语言中的结构变量; B.对象代表着正在创建的系统中的一个实体; C. 对象是一个状态和操作(或方法)的封装体; D.对象之间的信息传递是通过消息进行的; 7. 下面关于类概念的描述中,( )是错误的。 A.类是抽象数据类型的实现; B.类是具有共同行为的若干对象的统一描述体; C.类是创建对象的样板; D.类就是C语言中的结构类型; 8. C++对C语言作了很多改进,下列描述中( )使得C语言发生了质变,即从面向过程变成为面向对象。 A.增加了一些新的运算符; B.允许函数重载,并允许设置缺省参数; C.规定函数说明必须用原型; D.引进了类和对象的概念; 9. 按照标识符的要求,( )符号不能组成标识符。 A.连接符; B. 下划线; C.大小写字母; D.数字字符; 10. 下列符号中,( )不可作为分隔符。 A.,; B.:;C.?; D.;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值