我有以下代码:
#include <iostream>
using namespace std;
void func(char * aString)
{
char * tmpStr= new char[100];
cin.getline(tmpStr,100);
delete [] aString;
aString = tmpStr;
}
int main()
{
char * str= new char[100];
cin.getline(str,100);
cout<< str <<endl;
func(str);
cout<< str <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个cout不打印第二个输入字符串?如何更改此代码才能使用它?
Mic*_*l J 12
正如GregS所说,简单的答案是使用引用声明你的函数:
void func(char *&aString)
Run Code Online (Sandbox Code Playgroud)
然而,它并不是真正的最佳解决方案.在C++中,您通常会避免使用简单数组并使用容器.
#include <iostream>
#include <string>
void func(std::string &s)
{
std::getline(std::cin, s);
}
int main()
{
std::string str;
func(str);
std::cout << str << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为第二个cout将打印出指向的内容str.并且str,主函数中的指针在调用之前和之后将具有相同的值func.
实际上,在func函数中,您正在更改aString变量的值.但这是另一个变量而不是str主要变量.
如果要str更改值,则必须func通过引用或指针将其传递给它.(注意你写的是用指针传递字符.我的意思是你必须通过指针传递指针:void func(char **str_ptr)或者通过引用void func(char *&str_ref))
如果你真的在做C++,你应该使用std :: string而不是旧的C字符串.
通过指针传递指针的示例:
func(char ** aString)
{
char * tmpStr= new char[100];
cin.getline(tmpStr,100);
delete [] *aString;
*aString = tmpStr;
}
Run Code Online (Sandbox Code Playgroud)
另外你应该这样称呼它: func(&str);