当前位置: 首页 > 知识库问答 >
问题:

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

龚星洲
2023-03-14

我必须交换作为指针传递到函数中的两个字符字符串: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;
}   

共有2个答案

臧翰采
2023-03-14

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

例如

#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;
    }
}
墨雨华
2023-03-14

除非要复制已编写的代码,否则需要使用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中完成的),它也将不起作用(例如,不会编译)。

 类似资料:
  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • 我有以下代码: 我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告: 我正在努力理解问题是什么。

  • 当我构建这个应用程序时,我得到错误: 我也试过: 这将错误更改为: 下面是调用这个例程的类和我传递的回调函数的示例:

  • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 我正在尝试将参数传递给作为参数传递的函数指针。 代码: 我得到了这个错误: 类型"void"的参数与类型"void(*)(wchar_t*,wchar_t*)"的参数不兼容 如何解决此问题以完成我想要实现的目标? 编辑:对不起,不清楚。我实际上试图完成的是将函数注入子进程并传递两个参数(wchar_t*、wchar_t*),以便我可以使用它们。但主函数可以是void或int argc、char**

  • 在下面的代码中,当函数print_uart传输字符串“hello world”时,*s中到底收到了什么?是字符H还是存储字符串“hello world”的内存地址?