如何在函数中交换作为指针传递的 2 个字符串?

Posted

技术标签:

【中文标题】如何在函数中交换作为指针传递的 2 个字符串?【英文标题】:How to swap 2 strings passed as pointers in a function? 【发布时间】:2013-11-15 18:33:11 【问题描述】:

我必须将作为指针传递给函数的 2 个字符字符串交换: bool swap_strings (char* string1, char* string2) 如果两个字符串的长度不同,则返回 false,否则如果交换有效,则返回 true;

我怎么能意识到这一点?为什么这不正确:

#include <iostream>

using namespace std;


bool swap_strings(char * string1, char * string2)  
    char * s;
    char * s2;
    char * tmp = nullptr;
        for (s = string1; *s != '\0'; ++s);
        for (s2 = string2; *s2 != '\0'; ++s2);
        if ((s - s2)  != 0) 
            return false;
        
        else       
            tmp = *&string1;
            string1 = *&string2;
            string2 = *&tmp;
            cout << tmp << string1 << string2<< endl;
        

        return true;
    



int main()


    bool da = false;
    char s1[] = "hallo1";
    char s2[] = "ababab";

    da = swap_strings(s1, s2); 

    cout << da << s1 << s2 <<endl;
   

【问题讨论】:

如果您要使用char*s 来计算ss2,为什么要使用它们来计算长度?长度最好实现为整数值。此外,不需要使用for 循环来计算长度。使用strlen() @BrianGradin std::swap 在内部使用一个临时的。 那密密麻麻的无效代码让我瑟瑟发抖! 那是什么?字符串 1 ^= 字符串 2 ^= 字符串 1 ^ 字符串 2; 我可能不会使用像swap这样的内置函数.. 【参考方案1】:

除非您想复制已经编写的代码,否则您需要使用strlen 来获取字符串的长度:

unsigned int s1len = strlen(string1);
unsigned int s2len = strlen(string2);
if (s1len != s2len)
    return false;

如果你不能使用标准库函数(愚蠢的要求):

unsigned int s1len = 0;
for (char* s = string1; *s != '\0'; s++, s1len++);

会做同样的事情(你必须对两个字符串都这样做)。

之后,交换就很简单了:

for (unsigned int i = 0; i < s1len; ++i)

    std::swap(string1[i], string2[i]);

for (unsigned int i = 0; i < s1len; ++i)

    // these 3 lines are identical to what is done in std::swap
    char t = string1[i];
    string1[i] = string2[i];
    string2[i] = t;

您也可以(毫无疑问地违背了赋值的目的),只需更改指针值:

bool swap_strings(char*& string1, char*& string2)

    char* t = string1;
    string1 = string2; // string1 will now point to string2
    string2 = t; // string2 will now point to what use to be string1
    return true;

我说它违背了作业的目的,因为您没有进行任何复制,并且当您这样做时,长度要求无关紧要。当您传入数组时(例如,如果您将输入声明为 char a[] = "abcd"; - 您已在 main 中完成),它也将不起作用(例如,不会编译)。

【讨论】:

好的,非常感谢...但是我可以用指针算法实现交换吗?就像将指针分配给另一个指针或地址......然后像那样交换它? @user2774480:您可以通过引用传入指针并交换指针值。我将在更新中演示。 @ZacHowland 除了它们不是调用方的指针;它们是数组。 @WhozCraig 好点。该方法会破坏分配目的的另一个原因。 @user2774480 如果您认为数组是隐式指针,那您就错了。他们不是。指针是一个保存地址的变量。数组不会“保存”地址;它一个地址。【参考方案2】:

您可以简单地遍历传递的字符串,并进行逐个字符的交换。

例如

#include <assert.h>
#include <iostream>

bool swap_strings(char * const s1, char * const s2) 
    assert(s1 != nullptr);
    assert(s2 != nullptr);
    if (strlen(s1) != strlen(s2))
        return false;

    char * pch1 = s1;
    char * pch2 = s2;
    char temp;
    while (*pch1 != '\0') 
        temp = *pch1;
        *pch1 = *pch2;
        *pch2 = temp;

        ++pch1;
        ++pch2;
    
    return true;


int main() 
    using namespace std;

    char s1[] = "hallo1";
    char s2[] = "world2";

    if (swap_strings(s1, s2)) 
        cout << s1 << endl;
        cout << s2 << endl;
    

【讨论】:

以上是关于如何在函数中交换作为指针传递的 2 个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用交换函数和指针反转字符串数组? (C++)

如何检查 googlemock 中作为 void 指针传递的字符串参数

C 语言指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

C++ CreateThread函数如何传递this指针作为参数

如何在C中将函数指针数组的函数指针作为函数参数传递?

第八章 指针实验