簡體   English   中英

int和char之間的數據轉換

[英]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*之間的轉換,而是intchar之間的轉換。

以下代碼正是這樣做的:

#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::vectorstd::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.

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