编程语言
首页 > 编程语言> > 重学C++程序设计(四):今天还是巩固指针与面向对象程序设计!

重学C++程序设计(四):今天还是巩固指针与面向对象程序设计!

作者:互联网

第七题:

这个题不来自c++面向对象程序设计,是我自己量身打造了的一道题:
要求实现的功能:
第一:要实现字符串的除去多余空格!注意,是除去多余空格,要求要指针实现!比如:
输入: I like program (首尾可能也有空格)
输出:I like program

第二:要求做到字符串部分反转,意思是:保留单词内部原有的顺序,但是单词与单词之间的次序反转了,比如:
输入:I like program
输出:program like I

程序设计的要求:
私有成员:
一个字符指针,作为字符串的内部属性,后面的操作都在这个指针上进行!
公有成员:
一个构造函数,传参是传一个字符串首地址
一个析构函数,析构开辟的动态空间
至于上述的两个功能,如何实现,如何分配函数块,自由发挥!

ps:怎样,这题还是不难吧!我主要是自己想练习面向对象和指针操作,所以我提供的解决方案都是基于指针的

解决方案:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;

class String {
private:
	char* s;
public:
	String(char* str);
	void PorReverse();
	void RidBlock();
	void Show();
	~String() { delete[] s; }
};

String::String(char* str) {
	int len = strlen(str);
	s = new char[len + 1];
	strcpy(s, str);
}

void String::PorReverse() {
	char* p1 = s, *p2 = s;
	while (*p1 && *p2) {
		p2 = p1 + 1;
		while (*p2 && ' ' != *p2)
			p2++;
		char* ptr1 = p1, * ptr2 = p2 - 1;
		while (ptr1 < ptr2) {
			char Temp = *ptr2;
			*ptr2 = *ptr1;
			*ptr1 = Temp;
			ptr1++, ptr2--;
		}
		p2++;
		p1 = p2;
	}
	char* pp1 = s, * pp2 = s;
	while (*pp2)
		pp2++;
	pp2--;
	while (pp1 < pp2) {
		char Temp = *pp2;
		*pp2 = *pp1;
		*pp1 = Temp;
		pp1++, pp2--;
	}
}

void String::RidBlock() {
	char* ptr1 = s, * ptr2 = s;
	while (*ptr1 && ' ' == *ptr1)
		ptr1++;
	while (*ptr1) {
		*ptr2 = *ptr1;
		ptr2++, ptr1++;
	}
	*ptr2 = NULL;
	ptr1 = s, ptr2 = s;
	while (*ptr1) {
		if (' ' != *ptr1 || (' ' == *ptr1 && ' ' != *(ptr1 + 1) && NULL != *(ptr1 + 1))) {
			*ptr2 = *ptr1;
			ptr2++;
		}
		ptr1++;
	}
	*ptr2 = NULL;
}

void String::Show() {
	cout << "当前的 s = " << s << endl;
}

int main() {
	char str[85] = { '\0' };
	cin.getline(str, 80);
	String Test = String(str);
	Test.RidBlock();
	Test.Show();
	Test.PorReverse();
	Test.Show();
	return 0;
}

标签:p2,String,++,ptr2,C++,ptr1,char,面向对象,程序设计
来源: https://blog.51cto.com/u_15262702/2883296