-2

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

下面是我写的代码

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

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

    cout<<a;
}

如果我错了请纠正我

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

4

4 回答 4

3

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

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

在里面main,你可以调用这个函数。

于 2013-04-10T01:50:28.707 回答
1

你要这个:

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

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

于 2013-04-10T02:09:19.393 回答
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) ;
}
于 2013-04-10T01:53:44.377 回答
0

你问,

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

呈现此代码后:

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 恤或任何真正不值得的东西),但代价是为他人制造严重问题,有点像为了偷一小块巧克力而伤害一些旁观者。

于 2013-04-10T13:26:34.727 回答