[英]strcpy() is not copying properly c++
最近我做了一個程序,它有一個字符數組board[8][8][2];
它基本上是指可以存儲“ 2”個字母字符串的8X8板。 我沒有提供完整的代碼。
但這是問題所在。
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()
時沒有,這是什么問題。 該程序只是一個實踐程序,可以幫助您一臂之力。
C ++(和C)中的字符數組以Null字符( '\\0'
)結尾。 因此,即使您只需要在字符串中存儲兩個字符,也必須有一個額外的空間來存儲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字符,它將為您提供不確定的行為。
您可以向男人推薦有關它們的更多信息
您應該始終保留一個額外的字符,因為C和C ++中的字符串以null terminated
,因此它們需要一個額外的字符來對字符串的結尾進行簽名。
所以,請改變
board[8][8][2]
至
board[8][8][3]
以及sym[2]
到sym[3]
, a[2]
到a[3]
(通常在所有字符串的長度上加一個),然后重試。
通過查看strcpy
的手冊頁:
將source指向的C字符串復制到destination指向的數組中,包括終止的空字符(並在該位置停止)。
這意味着該函數僅在遇到空字符時才會停止。 這就是為什么如果沒有禮物會失敗的原因。 但是,通過一次設置一個字符,顯然不會出現這樣的問題(稍后,如果您嘗試執行僅在遇到空字符且有很多空字符時才停止的函數,該問題將變得可見)。
在C ++中終止的字符串為null('\\ 0')。 當您將字符數組傳遞給printf時,它將在空字符處停止打印。 我猜它在P7停止打印的唯一原因是因為您很幸運,下一個內存位置恰好存儲了Null。 您需要使char數組至少比要存儲的字符串長1個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.