通过在c ++中传递地址来修改字符串

时间:2013-04-10 01:47:35

标签: c++ string

我想通过外部函数修改main函数中存在的字符串变量,传递相同的地址。

以下是我撰写的代码

void change(char * str)
{
    str="Max";
}

void main() 
{    
    char a[]="Test";
    change(a);

    cout<<a;
}

如果我错了,请纠正我

请注意我使用的是Borland Turbo C ++ 4.5。

4 个答案:

答案 0 :(得分:3)

我猜你的意思是通过引用传递,你可以简单地通过引用传递给定的字符串,如下所示:

void modifyString( string& str)
{
   //modify the string
}

main内,您可以调用此函数。

答案 1 :(得分:1)

首先,你不应该使用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) ;
}

答案 2 :(得分:1)

你想要这个:

void change(char * str)
{
    strcpy(str,"Max");
}

回想一下指针是什么,指针本身不能只改变它所指向的内容。

答案 3 :(得分:0)

你问,

  

“如果我错了,请纠正我”

提交此代码后

void change(char * str)
{
  str="Max";
}

void main() {

char a[]="Test";
change(a);
cout<<a;
}

所以,这里是:

  • str="Max";
    仅更改本地指针str。使用符合C ++ 11标准的编译器,它甚至不会编译,因为str被声明为char*而文字"Max"的类型为char const [4],并且C ++ 11不再支持从字符串文字到指针到非const的隐式转换。

  • void main
    无论使用哪种标准,都不会使用任何符合标准的C或C ++编译器进行编译。但是,visual c ++会在没有诊断的情况下编译它。并且可能还有旧的turbo c ++,但请注意turbo c ++ 早于第一个C ++标准(1998年出版)。对于普通的托管C ++实现,标准需要int的{​​{1}}结果类型。

  • main
    如果不包含cout<<a;且具有<iostream>声明或指令,则不会使用符合标准的编译器进行编译。请注意,这随着标准化而改变。在1998年标准之前,在ARM C ++中,您可以包含using并使用不合格的<iostream.h>

在现代C ++中,正确的方法是

cout

another answer,正如我写的那样,您选择了“解决方案”,建议使用原始指针和#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 。使用原始指针和数组是建议,如果你遵循它会让你不高兴。例如,很容易无意中写入超出提供的缓冲区的末尾,带来灾难性的影响。所有权处理非常难以正确执行,等等。这个建议大概是在回答文字问题的Stack Overflow传统中给出的,而不考虑问题的真正含义,这是获得Stack Overflow声望点的好方法(它击败了我对他们这么可取,愚蠢的T恤或其他什么都不值得),代价是给别人造成严重的问题,有点像为了偷一小块巧克力而给一些旁观者致残。