重学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