int和char之间的数据转换

时间:2010-08-26 20:23:06

标签: c++

我正在学习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,我应该得到 表示(因此11将变成“11”)。

作为这项功课的一部分,我不允许使用任何第三方库。如果我想要什么,我必须自己做。

感谢。

编辑:您可以在IDEone中查看整个代码:http://ideone.com/nKXpg

4 个答案:

答案 0 :(得分:3)

嗯,标准库不是第三方,所以请使用它。

#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的情况下执行此操作,但它已被弃用,因为它太容易让溢出。

(我在这里假设输入和输出数据格式,但是iostream可能有一种格式化你想要的方式。)

答案 1 :(得分:1)

如果你的意思是你有一个整数数组,并且你想要打印这些整数的字符表示(假设它是可能的),你可以尝试类似的东西:

// 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;
}

答案 2 :(得分: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;
    }
}

答案 3 :(得分:0)

我最初想到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;
}