gpt4 book ai didi

c++ - strcpy() 没有正确复制 c++

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:45 25 4
gpt4 key购买 nike

最近做了一个程序,里面有一个字符数组board[8][8][2];

它基本上是一个 8X8 板,可以存储“2”个字母字符串。我没有提供完整的代码。

但是问题来了。

for (j = 0; j < 8; j++) {
strcpy(board[1][j], P[j].sym);
}

cout << board[1][1] << endl;

此处 P[1].sym="P1"P[0].sym="P0"P[2].sym= “P2”

因此 P[j].sym 基本上是一个两个字母的字符串,board[1][j] 也应该是一个两个字母的字符串。

但是输出为

cout << board[1][1] << endl;

作为 P1P2P3P4P5P6P7

给出

的输出
cout << board[1][0] << endl;

作为 P0P1P2P3P4P5P6P7

给出

为了

cout << board[1][5] << endl;

P5P6P7 是输出。

为了消除任何疑问,整个 board[8][8][[2] 已经初始化并且所有 P[j].sym 都已经初始化。

如果有帮助,这里是 P 的初始化代码:

#include <iostream>
#include <string.h>
using namespace std;

class Game
{
public:
char board[8][8][2];
char *****possibilities;
};

class Pawn : virtual public Game {
public:
char sym[2];
int possiblec[4][2];
Pawn() { }

Pawn(int i) {
char a[2];
a[0] = 'P';
a[1] = (char)(i + 48);
strcpy(sym, a);
}
};

在我做的程序的其他地方

    Pawn P[8];

它调用构造函数,然后我显式调用参数化构造函数。

for (int i = 0; i < 8; i++) {
P[i] = i;
}

在此之后,我检查了 P[j].sym 的不同值,它们都返回了我想要的完美值。

但是当我使用 strcpy() 时却不是这里有什么问题。这个程序只是一个练习程序,用来掌握它。

最佳答案

C++(和 C)中的字符数组以空字符 ('\0') 结束。因此,即使您只需要在字符串中存储两个字符,您也必须有额外的空间来存储 Null 字符。

不以 Null 字符结尾的字符数组会导致许多其他问题。这是错误的做法。

如果您的字符数组不以 Null 字符结尾,那么当您调用诸如 strcpy()strcat() 、等等……

所以,你应该改变

char board[8][8][2]

char board[8][8][3]

如果您有任何其他与此类似的字符串,那么也请在其中多留一个空格。

您的代码之所以表现如此,是因为您很幸运。

strcpy()strcat() 等函数都会继续复制(或追加),直到遇到空字符(在数值上等于零)。因此,它会继续这样做,直到遇到 Null 字符。但是如果没有 Null 字符,那么您很可能会得到未定义的行为。就您而言,您很幸运。

我将向您简要介绍 strcpy()(来自 here)

char * strcpy(char p, const char * q) {
while (*p++=*q++);
//there's also a return p; statement at the end
}

这就是函数。

while 循环一直执行到遇到 false,false 的等价物是 0。因此,当遇到 Null 字符(在数值上也等于 0 )时,while 循环终止,复制完成,函数结束。所以,如果最后没有 Null 字符,它会给你未定义的行为。

可以引用man有关它们的更多信息

关于c++ - strcpy() 没有正确复制 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29702486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com