2010-09-16 38 views
0
#include <iostream> 

using namespace std; 

int main() 
{ 
    char buffer[8]; 
    int field=534; 
    memcpy(buffer,&field,sizeof(field)); 
    cout<<buffer<<endl; 

    return 0; 
} 

這將返回一個空緩衝區。爲什麼?Memcpy int到字符緩衝區 - 作爲sprintf的替代品

基本上尋找替代sprintf將int轉換爲char緩衝區。

Itoa不可用。

想法?更好的選擇?

+0

嘗試使用此方法打印1212752128。如果這不起作用,那麼你是小端,所以嘗試2181448.(如果他們都沒有工作,那麼你是64位...) – TonyK 2010-09-16 09:51:28

+0

爲什麼itoa不可用? – 2010-09-16 10:09:03

+0

在'C'中,我會使'buffer'成爲一個'unsigned char'的數組。 – pmg 2010-09-16 10:10:16

回答

4

你將不得不用sprintf或itoa二進制INT轉換爲ASCII字符串。

表達式如果ints和和char數組完全不同,並且int可以使字節的值爲零,但字符串只能將其作爲最後一個字節。

例如

注意到0 - 在INT它是由4個字節值0,同時)作爲字符串具有48和0的前兩個字節所以沒有簡單的鑄造將chnage此

2

如果itoa如果可用,您可以使用它,該函數不是C++的一部分,但是被某些編譯器支持。

或者你可以這樣做:

std::stringstream out; 
out << field; 
strcpy(buffer,out.str().c_str()); 
+1

它是C標準lib的一部分,所以在任何符合C或C++編譯器的情況下都是如此。 – Mark 2010-09-16 09:43:22

+0

itoa不可用 – Alex 2010-09-16 09:44:31

+1

@Mark:不,itoa不是C標準庫的一部分。 C標準函數是'sprintf()'。 – caf 2010-09-16 11:19:47

2

表示你也可以使用istringstream:

istringstream ss(field); 
ss>>buffer; 
+0

+1!這真的有用嗎?我不確定。我雖然使用'ostringstream oss; oss << field;'並使用oss.str()而不是緩衝區.... – 2010-09-16 11:46:14

1

你的方法行不通,由於焦炭的兩種編碼和事實「9」 = 9,但爲什麼不建立自己的itoa!?它非常簡單(提示:X - 「0」將變成「0」 - 「9」爲0 - 9),或者只是從我認爲開源的libstdc的

+0

+1用於構建您自己的。 – 2010-09-16 10:09:58

3

任何一個複製源的itoa的變體光盤memcpy已成功。 Memcopy將複製字節並且不將字節轉換爲字符(如您所願)。你看不到534碰巧產生兩個不可打印的字符。嘗試使用18505,它會打印一條消息。不是你想要的。

如果itoa不可用,那麼你可以隨時編寫自己的。事實上,這是一個常見的計算機科學家庭作業問題。要做到這一點,你需要從整數中得到每個數字(提示整數除法將截斷 - 正是我們想要的!),並且需要將每個數字從0到9之間的整數轉換爲ascii表示。

這是足夠的提示,但如果你需要更多的幫助,然後隨意問。