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

strcpy() is not copying properly c++

本文关键字:复制 c++ strcpy      更新时间:2023-10-16

最近我做了一个程序,它有一个字符数组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]已经初始化并且所有的CCD_ 11已经被初始化。

如果有帮助的话,这里是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)中的字符数组以Null字符('')终止。因此,即使您只需要在字符串中存储两个字符,也必须有额外的空间来存储Null字符。

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

如果您的字符数组没有以Null字符结束,那么在调用strcpy()strcat()等函数时会遇到很多问题

所以,你应该改变

char board[8][8][2]

char board[8][8][3]

如果你有任何其他字符串,就像这个字符串一样,那么也要在其中留出一个额外的空间。

你的代码之所以如此,是因为你运气好。

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

我将向您展示strcpy()(从这里开始)的简要工作

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字符,它将为您提供未定义的Behavior。

你可以推荐男子了解更多关于他们的信息

您应该始终保留一个额外字符,因为C和C++中的字符串是null terminated,它们需要一个额外字符来对字符串的末尾进行签名。

所以,请更改

board[8][8][2]

board[8][8][3]

以及sym[2]sym[3]a[2]a[3](通常为所有字符串的长度加一)并重试。

通过查看strcpy:的手册页面

将源指向的C字符串复制到目的地,包括终止的null字符(并在这一点)。

这意味着该函数只有在遇到null字符时才会停止。这就是为什么如果没有人在场,它就会失败。但是,通过一次设置一个字符,显然不会出现这样的问题(如果你试图执行一个函数,该函数只有在遇到空字符时才会停止,并且有很多空字符,那么稍后就会变得可见)。

字符串在C++中以null('\0')结尾。当您将字符数组传递给printf时,它会在null字符处停止打印。我猜它在P7停止打印的唯一原因是你运气好,下一个内存位置恰好存储Null。您需要使您的char数组至少比要存储的字符串长1个字符。