-1

我无法让以下工作:

char* int_toChar ( int num ) {
    char* str = "0";
    if ( num != 0 ) {
        char* prefix = "";
        char* chars = " 123456789";
        int id = 0;
        for ( int i = 0; i < num; ++i ) {
            str = prefix + chars[id];
            if ( id == 9 ) {
                id = 0;
                //prefix = (char*)("") + chars[id];
            } else {
                ++id;
            }
        }
    }
    return str;
}

我制作这个函数是因为我想使用 printf_s 而不是 cout,但我想要一个将 int 转换为 char* 的函数,以便我可以在 printf_s 之外的其他函数中使用它

4

3 回答 3

1

我的意思是尽可能以最好的方式这样做,但是这个函数有很多问题,很难说从哪里开始:-你正在循环 num,你的输入。如果您将数字 2000000000 给您的函数,我不想看到会发生什么。 -char* 不是字符数组。它是一个指针。你不能把它当作一个值来返回,因为 str 指向的内存在这个函数返回后就不再是你的了。- 在第 8 行中,您正在添加一个指向字符的指针

如果你真的想让这样的东西工作,在我看来你需要学习一些关于 C 语言、指针以及 C 如何处理字符串的知识。我只会使用 sprintf(str, "%i", num); 现在,如果你想避免 cout。

于 2012-05-05T01:10:08.740 回答
1

您的问题从这里开始:

 char* str = "0";

字符串文字不是可写内存。

在那之后它只会变得更糟。

为什么不使用itoa

于 2012-05-05T01:13:13.167 回答
0

您将不得不分配一些内存,以某种方式将转换后的 int 放入其中,无论是静态的还是动态的。如果您分配一个静态缓冲区,那么您可以将转换后的 int 写入其中并返回一个指向它的指针,就像您发布的函数的接口显示的那样,但是您要返回的 char* 字符串只会继续包含该数字,直到下次调用该函数时。或者,您可以动态分配一个缓冲区来放置转换后的 int 字符(使用 malloc() 或 new),然后函数的调用者将负责稍后 free()'ing 或删除分配的缓冲区,否则你会有内存泄漏。如果您事先知道您的函数只会被使用有限的次数来创建固定数字字符串,特别是那些需要在您的程序生命周期中存在的,那么您不一定必须释放/删除它们。确保无论以何种方式分配它,都为可能需要创建的最大数字字符串分配足够的空间,可能基于 int 的大小(12 个字符足以表示任何正或负的 32 位整数值)。

现在,一旦分配了内存缓冲区,就需要将解码后的 int 值写入其中。您可以使用自己的自定义滚动循环来做到这一点,这肯定会涉及使用我在您的代码中没有看到的 / 和 % (除法和模数)运算符,或者最好使用已经可用的标准库函数来做给你的。一种方法是使用 sprintf(myBuffer, "%d", num)。

于 2012-05-05T01:20:09.437 回答