如何在C++中返回字符串
How to return a string in C++
#include <iostream>
#include<string.h>
using namespace std;
char *rt()
{
char a[20];
strcpy(a,"I am a beginner");
cout<<a;
return a;
}
int main()
{
char *a;
a=rt();
cout<<endl;
cout<<a;
return 0;
}
在这里,我制作了一个简短的程序来理解相同的内容。我期望输出为
I am a beginner
I am a beginner
更新:但事实证明是
I am a beginner
ëóG
我读过很多文章和帖子,但我无法理解他们复杂的语言......所以我会欣赏一个严肃的答案(对于一个愚蠢的......喜欢我!!
更新:实际上,我的作业中有一个问题是这样的
class COMPUTER
{
char chiptype[10];
int speed;
public:
void showdetails()
{
cout<<chiptype;
cout<<"t"<<speed;
}
void getdetails()
{
cin.getline(chiptype,10);
cin>>speed;
}
};
在这里,数据必须被读取并存储到二进制文件中。并且将显示芯片类型为"CD">的记录。
现在我的问题是...由于变量芯片类型是私有的,所以我不能在main((中使用它进行比较。所以我想做一个函数,返回存储在chiptype中的值。
而且我不允许使用 std::string 以及节点实现......
char a[20];
在堆栈上分配。当函数rt()
返回时,堆栈展开,a 超出范围。因此,您不会得到想要的结果。
当您在C++时,我可以建议使用std::string
阅读下面的评论:
另一个技巧是将数组包装在结构中,并返回 结构。由于结构是可复制的,因此数组在内部变为 可复制,不会失去范围。看到这个答案。那你不是 完全处理指针。看看这个活生生的例子——保罗·麦肯齐
使用 std::string 而不是 char[]
#include <iostream>
#include<string>
std::string rt()
{
std::string a("I am a beginner");
std::cout<<a;
return a;
}
int main()
{
std::string a;
a=rt();
std::cout<<std::endl;
std::cout<<a;
return 0;
}
在您的原始代码中,char a[20]
被分配在堆栈上,return a;
将返回一个指向堆栈变量的指针,当您在 main()
中收到该堆栈变量时,该指针不再有效 - 处理 C++ 中的字符串通常应该使用 std::string
来完成,因为它处理所有讨厌的内存管理,如果你不小心,这些内存管理会杀死你的程序。
如果您必须使用指针而不使用 std::string,则需要采用c
样式的方式,如果您错过了一两个步骤,则可能会有内存泄漏的风险。 使用c
样式的代码看起来像这样(保留cout c ++(
#include <iostream>
#include <strings.h>
std::string rt()
{
char *a = malloc(20); // allocate the memory on heap
strcpy(a,"I am a beginner");
std::cout<<a;
return a;
}
int main()
{
char *a;
a=rt();
std::cout<<std::endl;
std::cout<<a;
free(a); // release the memory
return 0;
}
注意:我不建议您执行上述样式 - 在实际应用程序中,您可能会因为忘记free
内存或在内存释放后意外访问内存而遇到麻烦。
程序从函数返回,a
的内存就会被破坏。我认为你不应该在你的知识水平上使用动态内存,所以我建议你在函数内部定义数组并修改它:
#include <iostream>
#include<string.h>
#define MAX_LENGTH 20
using namespace std;
void rt(char *a)
{
strcpy(a,"I am a beginner");
cout<<a;
}
int main()
{
char a[MAX_LENGTH];
rt(a);
cout<<endl;
cout<<a;
return 0;
}
此外,您应该注意rt
不要写超过 MAX_LENGTH
个字符。
如其他用途所述,std::string
而不是char []
。
std::string rt()
{
std:: string a = "I am a beginner"; // This statement is equivalent to std::string a("I am a beginner");
std::cout << a "n";
return a;
}
没有得到所需结果的主要原因是" char a[]
在堆栈上分配,但是当函数返回堆栈变为空时。
PS :您需要在程序中包含<string>
才能使用std::string
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从COM模块中的函数返回字符串数组?
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 我如何在函数 cpp 中返回字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 格式化返回字符串C++
- 返回字符串vs通过引用传递字符串以更新值
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 从 C++ 中的模板函数返回字符串和整数
- 返回字符串的散点回文计数
- C++重载字符串 [] 运算符以返回字符串和
- 返回字符串和不同向量数据类型的映射C++
- 字符串函数不返回字符串? C++
- 从函数返回字符串C++错误
- 如何在返回字符串的函数中不忽略void值
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- C - 返回字符串时的分割故障
- 使用向量和字符串函数返回字符串