【问题标题】:Passing char array in a function?在函数中传递char数组?
【发布时间】:2010-07-30 02:25:10
【问题描述】:

这是我有问题的编码: 我必须接受2名球员的名字。然后,当播放器标记更改存储在“currentPlayer”中的名称时,下一部分应该更改存储在 playerOne 或 playerTwo 中的名称。不是这样,我该如何解决?请解决,我试图用 & 符号使它成为一个引用变量,但我得到一个错误,说引用数组是不允许的。

void boardMarker(int &, char playerOne[], char playerTwo[], char &playerMarker, char currentPlayer[]);

int main()

{
    char playerOne[100];
    char playerTwo[100];
    char currentPlayer[100] = "playername";

    boardMarker(playerTurn, playerOne, playerTwo, playerMarker, currentPlayer);

}
void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char currentPlayer[100])
{
    // Set player markers
    //Player 1 uses X and Player 2 uses O
    if ( playerTurn == 1 )
    {
        playerMarker = 'X';
        currentPlayer = playerOne;
    }
    else
    {
        playerMarker = 'O';
        currentPlayer = playerTwo;
    }
}

【问题讨论】:

  • 无论谁投了反对票,都是不合适的。这是一个写得很好的问题。
  • 我什至不知道该怎么说你的代码现在看起来有多么错误。它甚至编译吗?!?!?!例如,您使用一个从未声明过的名为 playerTurn 的变量作为参数。
  • 在这种情况下,你为什么不投票来拉平分数?
  • @catchmeifyoutry:我正在写下我的答案(如下)......现在投票赞成。
  • 对于这个问题,我只包含了我遇到问题的代码。

标签: c++ arrays char


【解决方案1】:
  • 您不能将数组相互分配(您必须逐个元素地复制它们)
  • 当传递给函数时,数组衰减为指针,因此作为参数,char playerOne[100]char* playerOne 相同
  • char* 分配给另一个char* 不会复制字符串,而是复制指针。

正确的做法:

currentPlayer = playerOne;

这是:

strcpy(currentPlayer, playerOne);

或者,更好的是,因为这是 C++ 而不是 C,所以使用 std::string 而不是 char 数组。 std::string 基本上会按照您的预期行事。

【讨论】:

    【解决方案2】:

    您正在复制数组指针而不是其中的值。

    阅读关于数组的 C 教程http://augustcouncil.com/~tgibson/tutorial/arr.html

    【讨论】:

      【解决方案3】:

      您希望currentPlayer 成为一个指向字符的指针,然后在两个玩家之间交换它:

      您的代码,已编辑:

      void boardMarker(int&, char playerOne[], char playerTwo[], char &playerMarker, char** pCurrentPlayer);
      
      int main()
      {
          char playerOne[100];
          char playerTwo[100];
          char* currentPlayer = playerOne;
      
          boardMarker(playerTurn, playerOne, playerTwo, playerMarker, &currentPlayer);
      
      }
      void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char** pCurrentPlayer)
      {
          // Set player markers
          //Player 1 uses X and Player 2 uses O
          if ( playerTurn == 1 )
          {
              playerMarker = 'X';
              *pCurrentPlayer = playerOne;
          }
          else
          {
              playerMarker = 'O';
              *pCurrentPlayer = playerTwo;
          }
      }
      

      您的代码中的一些 cmets:

      • 变量playerTurnplayerMarker 不是 宣布。 (我假装他们是 全局变量,此处未显示)。
      • 你不应该留下参数 未命名,例如悬空的int& 在 boardMarker 的原型中。
      • 如前所述,playerOne 和 playerTwo 未初始化。让我们假装 它们在别处初始化。

      【讨论】:

      • 这将给出他想要的效果,但会改变他的程序的语义。 currentPlayer 现在是玩家名称字符串之一的别名,而不是保存当前玩家名称的值。
      【解决方案4】:

      在 C/C++ 中,数组的名称实际上是指向数组第一个元素的指针。比如

      *currentPlayer == 'p'
      

      现在,当您将数组传递给这样的函数时,您正在制作指针的副本,而不是数组本身。

      所以当你在你的功能中说

      currentPlayer = playerOne
      

      您所做的只是使指针 currentPlayer 指向与指针 playerOne 相同的内存位置。

      要得到你想要的,你需要使用strcpy

      strcpy(currentPlayer,playerOne)
      

      【讨论】:

      • 数组不是指针,我不会投反对票,因为这是一个常见的误解,但你应该回顾你的知识和答案。数组的名称一个引用数组的标识符,混淆来自于数组在大多数表达式中倾向于衰减为指针的事实以及事实该语言允许在一些被解析为指针语法的地方使用数组语法(即函数参数int a[10] 被解析为int*。但数组仍然是定义它们的范围内的数组并且可以这样使用在指针不能的地方。
      • 一个例子是void foo( int (&a)[3] );。该函数通过引用获取正好 3 个整数的数组。 int main() { int array[3]; int *p = array; foo(array); /*foo(p);*/ }array 可以传递给foo,因为它是 3 个整数的数组,p 不能,因为它是指向整数的指针(恰好被初始化为数组的开头3 个整数。
      • 说数组是指针是向可能是 C 新手的人解释它们的常用方式,因为这使得他们的许多“奇怪”行为更有意义。我可能应该更清楚数组像指针一样工作,但并不完全相同。顺便说一句,我不确定我是否曾经像您的示例那样编写过代码。我确实知道 sizeof(array) 是不同的。
      猜你喜欢
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-09-26
      • 2012-10-23
      • 2016-03-27
      相关资源
      最近更新 更多