我正在学习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
答案 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*
之间的转换,而是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;
}
答案 2 :(得分: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;
}
}
答案 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;
}