簡體   English   中英

strcpy()無法正確復制c ++

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM