2011-07-19 113 views
1

我想知道將整數轉換爲char/string的方法,反之亦然。如何在Linux(gcc)中將int轉換爲字符/字符串,反之亦然?

我已經使用的sprintf(& charvar, 「%d」,& intvar),但它會產生錯誤的輸出,有可能的垃圾。

我還聽說的atoi()在GCC有bugs.Reference:GCC atoi bug

什麼其他的方法來串/字符轉換回爲int?

其實我想發送一個整數從一臺機器到另一個使用SOCK_STREAM。

//編輯:我忘了告訴sprintf()做轉換並返回正值。

+1

我不會稱之爲「bug」,它只是int類型的限制。如果您需要避免溢出,請在使用'atoi'之前驗證輸入長度。 –

回答

1

如果你想爲一個整數發送到另一臺機器,你可以把它作爲二進制數據,僅僅通過直接發送intvar到流,你不必須先將其轉換爲字符。這隻會在知道數據長度時引入問題,因爲不同的值會生成不同長度的字符串。

+0

你的意思是發送(socket_file_desc,intvar,sizeof(int),0)? –

+1

是的,差不多:'send(socket_file_desc,&intvar,sizeof(int),0)'。 'send'取得要發送的數據的地址,而不是直接的值。 –

+0

以及如何接收它呢?我正在使用FILE * fp = fdopen(socket_file_desc,「r」); char c; C =龜etc(FP);在客戶端 –

1

intvar之前取出符號:

sprintf(&charvar,"%d",intvar) 

有兩點需要注意:

  • 在這裏,我假設&charvar是正確的類型,它有可能不是。
  • 雖然這裏可能沒有太大的區別,但養成使用snprintf而不是sprintf的習慣是很好的做法。

下面是一些示例代碼:

int intvar = ...; 
char str[16]; 
snprintf(str, sizeof(str), "%d", intvar); 
+0

仍然沒有區別,我輸入2並得到[作爲輸出,刪除&符號不能解決問題 –

1

請閱讀'sprintf'和'sscanf'手冊,也許他們的安全版本適合您。

0

您不能將sprintf設置爲變量。你需要一個緩衝區,因爲可能有幾個數字和尾隨零。而且,參數應該是int變量,而不是地址。

實施例:

char buffer[256]; 
int i = 42; 
sprintf(buffer, "%d", i); 

(緩衝器被填充有 '4', '2' 和尾隨 '\ 0')。

0

你的sprintf寫錯了。你應該寫sprintf(字符串,「%d」,integer); 如果你想通過網絡發送一個整數,這就是爲什麼你想將其轉換成字符串看看htons

具有這些功能,你可以轉換一個整數的網絡制式,並避免不同字節順序的問題!如果你希望你的字符串有整型值,那麼你應該用sprintf

char buf[4]; 
memcpy(buf,&integer,4); 

: 如果你只是想將其轉換爲字節你可以做這樣的事情。

相關問題