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

时间:2015-04-17 14:48:12

标签: c++ strcpy strcat

最近我制作了一个程序,它有一个字符数组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()的时候,这里有什么问题。这个程序只是一个练习程序,可以解决它。

3 个答案:

答案 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个字符。