我想通过外部函数修改主函数中存在的字符串变量,方法是传递相同的地址。
下面是我写的代码
void change(char * str)
{
str="Max";
}
void main()
{
char a[]="Test";
change(a);
cout<<a;
}
如果我错了请纠正我
请注意,我使用的是 Borland Turbo C++ 4.5。
我猜你的意思是通过引用传递,你可以简单地通过引用外部函数传递给定的字符串,如下所示:
void modifyString( string& str)
{
//modify the string
}
在里面main
,你可以调用这个函数。
你要这个:
void change(char * str)
{
strcpy(str,"Max");
}
回想一下指针是什么,指针本身不能仅更改它所指向的内容。
首先你不应该使用Turbo C/C++,它是很久以前最后一次更新的,
您可以按如下方式更改函数中的字符串,
void change(char * str)
{
*(str+0)='M';
*(str+1)='A';
*(str+2)='X';
*(str+3)='\0';
}
int main()
{
char a[]="Hello";
change(a) ;
}
你问,
“如果我错了,请纠正我”
呈现此代码后:
void change(char * str)
{
str="Max";
}
void main() {
char a[]="Test";
change(a);
cout<<a;
}
所以,这里是:
str="Max";
只改变本地指针str
。使用符合 C++11 标准的编译器,它甚至不会编译,因为str
它被声明为char*
while 文字"Max"
是 type char const [4]
,并且 C++11 不再支持从字符串文字到指向非的指针的隐式转换const
。
void main
无论哪种标准,都不会使用任何符合标准的 C 或 C++ 编译器进行编译。但是,Visual C++ 将在没有诊断的情况下编译它。并且可能旧的 turbo c++ 也是如此,但请注意,turbo c++早于第一个 C++ 标准(于 1998 年推出)。该标准要求普通托管 C++ 实现的int
结果类型。main
cout<<a;
<iostream>
如果不包含并具有using
声明或指令
,则不会使用符合标准的编译器进行编译。请注意,这随着标准化而改变。在 1998 年标准之前,在 ARM C++ 中,您可以包含<iostream.h>
和使用 unqualified cout
.
用现代 C++ 编写程序的正确方法是
#include <iostream> // std::cout, std::endl
#include <string> // std::string
using namespace std;
string foo() { return "Max"; }
int main()
{
string a = "Test";
a = foo(); // Changed!
cout << a << endl;
}
另一个答案,在我写这篇文章时,你选择了“解决方案”,建议使用原始指针和strcpy
,而不是std::string
. 使用原始指针和数组是一个建议,如果你遵循它会让你不开心。例如,很容易在不经意间写入超出所提供缓冲区的末尾,从而造成灾难性的后果。所有权处理非常难以正确进行,等等。该建议可能是在回答字面问题的 Stack Overflow 传统中给出的不考虑问题的真正含义,这是获得 Stack Overflow 声誉积分的好方法(它让我觉得它们如此令人向往,愚蠢的 T 恤或任何真正不值得的东西),但代价是为他人制造严重问题,有点像为了偷一小块巧克力而伤害一些旁观者。