最近我制作了一个程序,它有一个字符数组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()
的时候,这里有什么问题。这个程序只是一个练习程序,可以解决它。
答案 0 :(得分:5)
C ++(和C)中的字符数组以Null字符('\0'
)终止。因此,即使您只需要在字符串中存储两个字符,也必须有一个额外的空间来存储Null字符。
不以Null字符结尾的字符数组可能会导致许多其他问题。这是一种错误的做法。
如果您的角色数组没有以Null字符终止,那么在调用strcpy()
,strcat()
等函数时会遇到很多问题......
所以,你应该改变
char board[8][8][2]
到
char board[8][8][3]
如果你有任何其他字符串就像这个字符串一样,那么也留下一个额外的空格。
你的代码表现如此,是因为你很幸运。
strcpy()
,strcat()
等函数都会继续复制(或追加),直到遇到空字符(在数字上等于零)。因此,它会继续这样做,直到遇到Null字符。但是如果没有Null字符,那么很可能会得到Undefined Behavior。在你的情况下,你很幸运。
我将向您展示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了解有关他们的更多信息
答案 1 :(得分:3)
你应该总是保留一个额外字符,因为C和C ++中的字符串是null terminated
,他们需要一个额外的字符来签署字符串的结尾。
所以,请改变
board[8][8][2]
到
board[8][8][3]
以及sym[2]
到sym[3]
,a[2]
到a[3]
(通常会在所有字符串的长度上添加一个)并重试。
查看strcpy
的手册页:
将source指向的C字符串复制到指向的数组中 destination,包括终止空字符(并停止在 那一点)。
这意味着该函数仅在遇到空字符时才会停止。这就是为什么如果没有任何礼物就会失败的原因。但是,通过一次设置一个字符,显然没有这样的问题可见(如果你试图执行一个仅在遇到空字符并且有很多字符时停止的函数,它将在稍后可见)。
答案 2 :(得分:2)
字符串为空('\ 0')在C ++中终止。将字符数组传递给printf时,它将停止以null字符打印。我猜它在P7停止打印的唯一原因是因为你很幸运,下一个内存位置恰好存储空。您需要使char数组的长度至少比要存储的字符串长1个字符。