【问题标题】:Swapping two strings in C++在 C++ 中交换两个字符串
【发布时间】:2016-10-11 17:10:19
【问题描述】:

参数 (char * &str1, char * &str2) 在交换函数中指定了什么?如果它们在交换函数中被 (char &str1, char &str2) 和 char *temp=str1 替换为 char &temp=str1 会怎样?

#include<iostream>
using namespace std;

void swap(char * &str1, char * &str2)
{
char *temp = str1;
str1 = str2;
str2 = temp;
}

int main()
{
char *str1 = "GEEKS";
char *str2 = "FOR GEEKS";
swap(str1, str2);
cout<<"str1 is "<<str1<<endl;
cout<<"str2 is "<<str2<<endl;
return 0;
}

【问题讨论】:

  • 你认为这个函数是做什么的,如果是char&你认为它应该做什么
  • 这里的危险:char *str1 = "GEEKS"; "GEEKS"const char * 而不是 char * 你应该有一个编译器警告,建议你不要这样做。如果您修改指针处的内容而不是仅仅交换指针,则会导致未定义的行为。
  • 替换为 char& 产生相同的输出。为什么需要将类型声明为指向引用的指针 (char * &str1) @UKMonkey
  • “指向引用的指针” - 不,其他方式 - 引用指针。
  • 当您将指针传递给函数时,您可以修改指针处的数据,并且由于调用者和函数都在查看相同的位置,因此两者都会看到变化。但是,传递给函数的指针只是被复制。如果您更改副本指向的位置,调用者将不知道。调用者有原件,原件不变。使用对指针的引用意味着调用者和函数都使用相同的指针,这与最初的指针非常相似。阅读引用传递和值传递。

标签: c++ pointers reference


【解决方案1】:

参数 (char * &str1, char * &str2) 在交换函数中指定了什么?

它们指定参数是指向 char 的指针的类型引用。这意味着该函数可能会更改作为该函数参数提供的变量的值。

如果它们在交换函数中被 (char &str1, char &str2) 和 char *temp=str1 替换为 char &temp=str1 会怎样?

然后你会得到编译器错误,因为你仍然会这样调用它:swap(str1, str2);,你必须将调用更改为swap(*str1, *str2);,然后你将交换两个字符串的第一个字母。

[编辑]

您的代码还包含另一个细微的错误,您使用了using namespace std;,这会导致在您将swap 函数签名更改为void swap(char &amp;str1, char &amp;) 时调用std::swap

您还应该看到如下警告:

main.cpp:17:14: 警告:ISO C++ 禁止将字符串常量转换为 'char*' [-Wpedantic] char *str1 = "极客";

这是因为字符串文字是 const 指针,否则你会在代码中引入 UB。你应该改成const char *str1

【讨论】:

  • 我没有得到任何编译器错误,相反,我得到了相同的输出,字符串完美交换。 @Marcinj
  • @SrinathThumati 您确定代码已构建并且您没有运行上次构建程序时创建的可执行文件吗?如果您可以确认您确实构建了该代码,请告诉我们您使用的编译器以及您设置的错误和警告级别。尝试将 char * 填充到 char 应该会让编译器尖叫并拒绝构建。
  • @SrinathThumati 那是因为您调用的是模板 std::swap,这也是为什么您永远不应该使用 using namespace std;
  • @user4581301,我使用在线 IDE、Geeksforgeeks IDE 和 ideone IDE 编译了代码。你说这次执行是因为这些在线编译器中设置的错误或警告级别?
  • @Marcinj 你是对的。我认为命名空间 std 的效果只有在我将它们与关键字 std:: 一起使用时才会产生效果:)
【解决方案2】:

参数 (char * &str1, char * &str2) 在交换函数中指定了什么?

他们指定此函数接受 2 个对指向 char 的指针的引用。如果有疑问,请使用typedef(至少在您的脑海中):

typedef char * pchar;
void swap( pchar &str1, pchar &str2 );

如果它们在交换函数中被 (char &str1, char &str2) 和 char *temp=str1 替换为 char &temp=str1 会怎样?

然后你将交换两个chars,而不是两个指向char的指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多