我从计算中获得了一个带有小数部分为0的双精度值,然后想要将此值转换为由数字组成的字符数组(使用ascii代码),然后返回它...我为它编写了以下代码...
char* as_string(double a,char* ptr)
{
int digits=0;
for(int i=1;;i++)
{if(static_cast<int>(a/pow(10.0,i))==0)
{digits=i;
break;}
}
char b[digits];
for(int i=digits-1;i>=0;i--)
{
b[digits-1-i]=static_cast<int>(a/pow(10.0,i))+48;
a=a-((b[digits-1-i]-48)*pow(10.0,i));
}
strncpy(ptr,b,digits);
return ptr;
}
一切都没事了......没有语法错误,但是在运行时每次都重写了...经过一番审查后我发现错误发生在指针ptr和strcpy语句周围(因为数组b是成功测试填充数字)...任何人都可以PLZ。指出错误?
答案 0 :(得分:5)
没有必要重新发明轮子。
这样的东西应该可以正常工作(请注意,因为你使用的是C ++,我把它变成了std::string
):
std::string as_string(double a) {
std::ostringstream ss;
ss << a;
return ss.str();
}
答案 1 :(得分:3)
你需要为ptr分配足够的内存来存储b的内容,除非你在将它传递给你的函数之前已经完成了(因为你把ptr作为第二个参数)。
答案 2 :(得分:3)
你应该问问自己这个问题:
ptr
是否指向一个足以容纳digits
的内存位置?
我不这么认为。
问题是你正在向函数传递一个指针ptr
,但你事先并不知道需要将多少内存分配给ptr
。
您可以选择两个选项:
您可以猜测可能的最大值使用ptr
或在堆栈&amp;上为new
分配相同的值。然后将ptr
传递给函数
或
使用ptr
在函数内部为new
分配内存,您可以确切地知道需要多少内存。请注意,要这样做,您必须将ptr
作为双指针传递。
答案 3 :(得分:2)
我强烈怀疑你传递给函数的指针没有指向有效的内存。 例如,以下内容将导致未定义的行为(包括但不限于崩溃)。
char x;
as_string(0.232, &x); //UB
char y[too_small_size];
as_string(0.344, y); //UB
答案 4 :(得分:0)
digits
。