c++编写成员函数GetString,使其能返回该类的字符串,但不能通过外部变量修改该类内部的字符串。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++编写成员函数GetString,使其能返回该类的字符串,但不能通过外部变量修改该类内部的字符串。相关的知识,希望对你有一定的参考价值。

题目是这样的:
1. 定义类KeepString,用于保存一个字符串。
class KeepString

private:
char* str;
;

2. 编写成员函数GetString,使其能返回该类的字符串,但不能通过外部变量修改该类内部的字符串。例如:
void main()

KeepString KS("Internal String");

char *p = KS.GetString();

p[0] = 'i';
p[9] = 's';

cout << p << endl; // 输出字符串:internal string

cout << KS.GetString() << endl; // 输出字符串:Internal String

然后我的程序是这样的:
#include<iostream>

using namespace std;

class KeepString
private:
char* str;
public:
KeepString(char s[]);
char* GetString();
;

KeepString::KeepString(char s[])
strcpy(str,s);


char* KeepString::GetString()
char s[100]=0;
strcpy(s,str);
return s;


int main()
KeepString KS("Internal String");
char *p = KS.GetString();
p[0] = 'i';
p[9] = 's';
cout << p << endl;
cout << KS.GetString() << endl;

输出是:

麻烦帮看看是哪里出问题了

问题是在字符串作为函数参数的传值问题。
C没有string类,但是C++有,如果依赖于字符数组管理字符串必须理解字符串、字符数组、指针之类的概念。

char a[]定义了一个数组,a的类型是char [],有自己的空间存储字符。
当a作为参数传递给函数是,参数类型会变为char *,仅仅传递了a的首地址。如果在函数里对a进行操作,也会影响函数外的数组。

因此该类的设计应该是:
类必须有自己的字符数组空间,来存储char *参数指向的字符串。

在构造函数里KeepString(char s[]),调用strcpy将s所指向的字符串赋值给对象的成员变量。也就是说,成员变量也必须是一个有自己空间的数组,而不是一个char *指针。

通过函数来返回该字符串,必定不能将该成员变量的地址返回,不然通过地址是可以更改字符串的。而且局部变量的内存空间在跳出代码块后会被释放,所以不能返回一个字符数组。因此需要设计一个成员函数,来接受一个char *外部参数,在函数内部同样调用strcpy将字符串内容拷贝一份至该外部参数。该外部参数需要有自己的内存空间。
伪代码:
class A

char s[100];//足够大的数组
A(char *t); //将t指向的字符串拷贝至成员变量s;
getString(char *t); //将s拷贝至参数t指向的内存空间

main()

char t[];
A a(t);
char str[]
a.getString(str);

具体代码自己完善
参考技术A #include<iostream>
#include<string.h>

using namespace std;

class KeepString
private:
char *str;
public:
KeepString(const char s[]);
char* GetString();
;

KeepString::KeepString(const char s[])
str = new char[strlen(s)+1];
strcpy(str,s);


char* KeepString::GetString()
char *s = new char[strlen(str)+1];
strcpy(s,str);
return s;


int main()
KeepString KS("Internal String");
char *p = KS.GetString();
p[0] = 'i';
p[9] = 's';
cout << p << endl;
cout << KS.GetString() << endl;

Python:如何编写代码,使其能自动在cmd中输入?

举例:首先有一个在cmd中运行的小程序,假设为"apple.cmd",然后os.system('apple.cmd'),此时弹出了该程序在cmd上的运行过程。但由于中间该程序因某种原因(如未找到‘xxx文件’),显示“是否继续Y/N”,需要按Y 才能继续执行,该如何去处理这个按Y的动作?

参考技术A 类似这样,
from subprocess import Popen, PIPE, STDOUT
p = Popen(['myapp'], stdout=PIPE, stdin=PIPE, stderr=PIPE)stdout_data = p.communicate(input='data_to_write')[0]

但是你需要同时监控stdout以便确定输入的时机(自己查,也可以帮写)本回答被提问者和网友采纳
参考技术B 加个异常处理,try,exception
如果遇到异常,自动输入“Y”
希望我的回答对你有帮助,你的采纳就是最好的鼓励~追问

不是异常,是流程的一部分,举例说:工具未找到‘xx文件’,是否继续Y/N?是这类问题

以上是关于c++编写成员函数GetString,使其能返回该类的字符串,但不能通过外部变量修改该类内部的字符串。的主要内容,如果未能解决你的问题,请参考以下文章

请教怎样用c++/cli封装c++的code,使其能被c#调用

派生类中事件绑定的事件处理函数是类实例方法使其能访问父类和派生类所有数据

c语言根据以下描述编写一个程序使其能完成对稀疏矩阵的压缩与还原,即给定稀疏矩阵可以压缩存储一个三元组

修改汇编语言程序,添加功能 使其能完成以下功能

C#从返回char指针的c++函数中获取字符串/字符值

编写从 C++ 应用程序链接的 Delphi DLL:访问 C++ 接口成员函数会导致访问冲突