簡體   English   中英

如何初始化一個char數組?

[英]how to initialize a char array?

char * msg = new char[65546];

想要將它們全部初始化為 0。 在 C++ 中執行此操作的最佳方法是什么?

char * msg = new char[65546]();

它被稱為值初始化,並在C ++ 03中引入。 如果你碰巧發現自己被困在前十年,那么你需要使用std::fill() (或memset()如果你想假裝它是C)。

請注意,這不適用於零以外的任何值。 我認為C ++ 0x會提供一種方法來做到這一點,但我有點落后於時代,所以我不能對此發表評論。

更新:似乎我對語言的過去和未來的反思並不完全准確; 請參閱更正的評論。

“大多數C ++”的方法是使用std::fill

std::fill(msg, msg + 65546, 0);

沒有一個非常好的理由不這樣做,我可能會使用:

std::vector<char> msg(65546, '\0');

在C ++中執行此操作的最佳方法是什么?

因為你這樣問:

std::string msg(65546, 0); // all characters will be set to 0

要么:

std::vector<char> msg(65546); // all characters will be initialized to 0

如果您正在使用接受char *或const char *的C函數,那么您可以:

some_c_function(&msg[0]);

如果它接受const char *或data(),你也可以在std :: string上使用c_str()方法。

這種方法的好處是,您可以使用動態分配的char緩沖區執行所有操作,但更安全,更靈活,有時甚至更高效(避免需要線性重新計算字符串長度,例如)。 最重要的是,您不必釋放手動分配的內存,因為析構函數將為您執行此操作。

此方法使用' C'memset函數,並且速度非常快(避免了char-by-char循環)。

const uint size = 65546;
char* msg = new char[size];
memset(reinterpret_cast<void*>(msg), 0, size);
memset(msg, 0, 65546)

你可以使用for循環。 但不要忘記最后一個字符必須是空字符!

char * msg = new char[65546];
for(int i=0;i<65545;i++)
{
    msg[i]='0';
}
msg[65545]='\0';

類似C的方法可能沒有這個問題的其他解決方案那么有吸引力,但為了完整性,這里添加了:

你可以用這樣的NULL初始化:

char msg[65536] = {0};

或者使用零考慮以下內容:

char msg[65536] = {'0' another 65535 of these separated by comma};

但不要嘗試不可能 ,所以使用memset!

在第二種情況下,如果要將msg用作字符串,請在memset之后添加以下內容。

msg[65536 - 1] =  '\0'

這個問題的答案也提供了進一步的見解。

如果您感到恐慌並且無法在構造函數中將動態數據分配給const char *,您可以逐個插入動態緩沖區的每個元素。 您甚至可以在進行印記之前將 snprintf() 寫入緩沖區。

    client_id = new char[26] {
        buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],
        buf[10],buf[11],buf[12],buf[13],buf[14],buf[15],buf[16],buf[17],buf[18],buf[19],
        buf[20],buf[21],buf[22],buf[23],buf[24],'\0'
    };

為了掩蓋你一直在做的事情,也許編輯器有一個選項,你可以將前景色設置為與背景相同?

在被解雇之前,您實際上可以在頭文件聲明中用足夠的空間填充 const 字符,然后在構造函數中分配實際數據。 偉大的!

const char*  client_id = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

它是一個 const 指針,在構造函數處理它之前不必初始化。

const char*  client_id;

注意:您可以在頁面頂部寫: using namespace std,從而避免在每個命令的開頭寫 std::。

字符 * 味精 = 新字符 [65546]={0}; 此命令將所有數組重置為 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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