[英]Data conversion between int and char
我正在學習C ++測試,但無法解決此問題:
我有int *的數據,我想將其打印為char *
我以為可以通過以下方式實現:
// pOutputString is of type char*
// pIntegers is of type int*
int pos = 0;
for (int i = 0; i< SIZE; i++)
{
pOutputString[pos] = char(pIntegers[i]);
pos++;
}
如果我使用iostream遍歷pOutputString,則應該獲得tring表示形式(因此11會變成“ 11”)。
作為本作業的一部分,不允許我使用任何第三方庫。 如果我想要一些東西,我必須自己做。
謝謝。
編輯:您可以在IDEone中查看整個代碼: http ://ideone.com/nKXpg
好吧,標准庫不是第三方的,所以使用它。
#include <sstream>
#include <cstring>
using namespace std;
ostringstream s;
for (int i = 0; i< SIZE; i++) {
s << ( i? ", " : "" ) << pIntegers[i];
}
strcpy( pOutputString, s.str().c_str() );
頭文件<strstream>
和類ostrsream
可以在沒有strcpy
情況下執行此操作,但是由於它太容易允許溢出而被棄用。
(我在此假設輸入和輸出數據的格式,但是iostreams可能有一種您想要格式化的方法。)
如果您的意思是您有一個整數數組,並且想要打印這些整數的字符表示(假設有可能),則可以嘗試執行以下操作:
// int in[SIZE] is given
char out[SIZE];
for(int i = 0; i < SIZE; i++)
{
out[i] = static_cast<char>(in[i]);
}
std::cout << out;
順便說一下,它不是int*
和char*
之間的轉換,而是int
和char
之間的轉換。
以下代碼正是這樣做的:
#include <iostream>
int main()
{
int in[] = {50,55,35};
char out[3];
for(int i = 0; i < 3; ++i)
{
out[i] = static_cast<char>(in[i]);
}
std::cout << out << std::endl;
return 0;
}
有沒有更大的圖景? 不知道如何定義pOutputString
,就不能安全地回答此問題。 char *pOutputString
僅足以容納一個整數的一個字符串表示形式(除非您希望將字符串表示形式並置為一個大字符串)。
如果您有一個char** OutputStrings
(或者更好的是char* OutputStrings[]
),則可以像遍歷pIntegers那樣對其進行迭代-請記住,每個OutputStrings[i]
需要為其分配內存! (這就是為什么我們在實際代碼中使用std::vector
和std::string
)。
練習的真正目的是編寫自己的“字符串表示整數”(即您自己的itoa )函數嗎? 如果是這樣,那還不錯-進行除法,模量和添加ascii'0':)
假設您不需要將轉換后的字符串存儲在任何地方,請查看以下程序結構:
void IntToString(char* output, int input)
{
// do div/mod/add-char('0') magic here, terminate buffer with \0 .
}
int main( int argc, const char* argv[] )
{
int a[SIZE] = { /* put your contents here */ };
char outstring[12];
for(int i=0; i<SIZE; i++)
{
IntToString(outString, a[i]);
cout << outstring << endl;
}
}
我最初想到的是itoa,但看起來它是一個非標准函數。 一個好的“ C ish”? 可能是嘗試(標准C庫不是第三方庫)。
int main(){
char buf[sizeof(int)*3 + 2];
int x = 66;
sprintf(buf, "%d", x);
cout << buf;
}
如果該想法是完全手動編碼而不使用任何庫函數,那么其他人已經提供了出色的答案。
編輯2這是另一個又快又臟的實現(strlen和strrev帶有臟替換)
int main(){
char buf[sizeof(int)*3 + 2] = {};
int x = 0;
int q = 0;
int r = 0;
int index = 0;
cin >> x;
if(0 == x)
buf[index++] = 48;
else{
while(x){
q = x / 10;
r = x % 10;
buf[index++] = r + 48;
x /= 10;
}
}
char *p = buf;
size_t len = 0;
// e.g. for 255, the buffer now has 552, need to reverse it
// dirty replacement for strlen
while(*p++) len++;
len--;
// dirty reversing logic for strrev
for(size_t s = 0; s <= len/2; s++){
char t = buf[s];
buf[s] = buf[len-s];
buf[len-s] = t;
}
cout << buf;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.