strcpy()没有正确复制c++
strcpy() is not copying properly c++
最近我做了一个程序,它有一个字符数组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()
时不是这样。这里的问题是什么。这个程序只是一个掌握窍门的练习程序
' '
)终止。因此,即使您只需要在字符串中存储两个字符,也必须有额外的空间来存储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个字符。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 使lambda不可复制/不可移动