交换参数列表 C++ 中的两个字符串

Posted

技术标签:

【中文标题】交换参数列表 C++ 中的两个字符串【英文标题】:Swap two strings from parameter list C++ 【发布时间】:2020-09-12 01:11:30 【问题描述】:

我正在尝试使用以下方法在 C++ 中交换两个字符串。我将它们作为参数传递,并且在方法本身中它们似乎正确交换。但是,当我在调用 swap 方法后输出字符串时,它们并没有改变。知道为什么吗?非常感谢您的帮助!

void swap(char* stringA, char* stringB)
    char temp[100];
    for (int i = 0; i < 100; ++i)
        temp[i] = stringA[i];
    
    
    stringA = stringB;
    stringB = temp;


int main() 
    char *greeting = "Hello";
    char *dismissal = "Good Bye";

    swap(greeting, dismissal);
    printf("greeting: %s dismissal: %s\n", greeting, dismissal);
    
    return 0;


输出:

greeting: Hello dismissal: Good Bye

【问题讨论】:

在 C++ 中,只需一个简单的std::swap(string1, string2);,其中string1string2std::string。使用char *(不是字符串,而是指针)的原因是什么?此外,这看起来像 C 而不是 C++。你确定你选择了正确的语言标签吗? 在 C++ 中使用 std::string 让自己免于痛苦、痛苦和折磨的无尽噩梦,即 C 字符串。 你的代码也有未定义的行为,因为它从数组greeting(来自main())复制了100个字符,它指向一个只有六个字符的数组的第一个元素。 这能回答你的问题吗? c++ void function not changing value of string 【参考方案1】:

您只是在修改 swap 函数中的指针副本。如果要更改调用站点的指针,则需要通过引用传递它们。此外,您将字符串的内容视为包含 100 个元素,但它们不包含,因此当您在这些位置建立索引时会调用未定义的行为。

你可以像这样简单地编写函数:

void swap(char const * &stringA, char const* &stringB) 
    auto temp = stringA;    
    stringA = stringB;
    stringB = temp;

或者直接使用std::swap

此外,从 c++11 开始,您不能将字符串文字分配给 char *,您需要将其分配给 char const *

这是demo。

【讨论】:

以上是关于交换参数列表 C++ 中的两个字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用交换和递归在 C 和 C++ 中的字符串反向性能

总结 Python 编程中的一些小 Tricks

按单个字符比较两个字符串 C++

C++ 从可变长度参数列表中提取 std::string

C语言中怎样交换两个字符串

返回字符串以及 Json 中的列表数据作为输出