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]
已经初始化
并且所有 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
的不同值,所有这些 return 都是我想要的完美值。
但是我用的时候不是strcpy()
这里有什么问题。这个程序只是一个练习程序,可以掌握它。
字符串在 C++ 中以空值 ('\0') 终止。当您将字符数组传递给 printf 时,它会在空字符处停止打印。我猜它在 P7 停止打印的唯一原因是你很幸运,下一个内存位置恰好存储 Null。您需要使您的 char 数组比您要存储的字符串至少长 1 个字符。
你应该总是保留一个 额外的字符 因为 C 和 C++ 中的字符串是 null terminated
,它们需要一个额外的字符来标记字符串的结尾。
所以,请改变
board[8][8][2]
到
board[8][8][3]
以及sym[2]
到sym[3]
、a[2]
到a[3]
(一般所有字符串的长度加一)再试。
通过查看 strcpy
的手册页:
Copies the C string pointed by source into the array pointed by
destination, including the terminating null character (and stopping at
that point).
这意味着该函数只有在遇到空字符时才会停止。这就是为什么如果没有 present 就会失败。但是,通过一次设置一个字符,显然没有这样的问题可见(如果您尝试执行一个仅在遇到空字符时停止的函数并且有很多空字符,它会在以后变得可见)。
C++(和 C)中的字符数组以空字符 ('[=13=]'
) 结束。因此,即使您只需要在字符串中存储两个字符,您也必须有一个额外的 space 来存储 Null 字符。
不以 Null 字符结尾的字符数组会导致许多其他问题。这是错误的做法。
如果你的字符数组不以 Null 字符结尾,你在调用 strcpy()
、 strcat()
等函数时会遇到很多问题...
所以,你应该改变
char board[8][8][2]
到
char board[8][8][3]
如果您有任何其他字符串,就像这个字符串一样,请在其中多留一个 space。
您的代码之所以如此,是因为您很幸运。
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 了解更多关于它们的信息
最近做了一个程序,里面有一个字符数组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
的不同值,所有这些 return 都是我想要的完美值。
但是我用的时候不是strcpy()
这里有什么问题。这个程序只是一个练习程序,可以掌握它。
字符串在 C++ 中以空值 ('\0') 终止。当您将字符数组传递给 printf 时,它会在空字符处停止打印。我猜它在 P7 停止打印的唯一原因是你很幸运,下一个内存位置恰好存储 Null。您需要使您的 char 数组比您要存储的字符串至少长 1 个字符。
你应该总是保留一个 额外的字符 因为 C 和 C++ 中的字符串是 null terminated
,它们需要一个额外的字符来标记字符串的结尾。
所以,请改变
board[8][8][2]
到
board[8][8][3]
以及sym[2]
到sym[3]
、a[2]
到a[3]
(一般所有字符串的长度加一)再试。
通过查看 strcpy
的手册页:
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
这意味着该函数只有在遇到空字符时才会停止。这就是为什么如果没有 present 就会失败。但是,通过一次设置一个字符,显然没有这样的问题可见(如果您尝试执行一个仅在遇到空字符时停止的函数并且有很多空字符,它会在以后变得可见)。
C++(和 C)中的字符数组以空字符 ('[=13=]'
) 结束。因此,即使您只需要在字符串中存储两个字符,您也必须有一个额外的 space 来存储 Null 字符。
不以 Null 字符结尾的字符数组会导致许多其他问题。这是错误的做法。
如果你的字符数组不以 Null 字符结尾,你在调用 strcpy()
、 strcat()
等函数时会遇到很多问题...
所以,你应该改变
char board[8][8][2]
到
char board[8][8][3]
如果您有任何其他字符串,就像这个字符串一样,请在其中多留一个 space。
您的代码之所以如此,是因为您很幸运。
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 了解更多关于它们的信息