在C语言中将整型转换为字符 #包括 char*intToString(intn); 整数幂(整数N,整数M) { int n=n; 如果(M==0)返回1; int i; 对于(i=1;i1) { M/=10;numberLen++; } int-ar[numberLen]; 字符str[numberLen+1]; int i; 对于(i=0;i

在C语言中将整型转换为字符 #包括 char*intToString(intn); 整数幂(整数N,整数M) { int n=n; 如果(M==0)返回1; int i; 对于(i=1;i1) { M/=10;numberLen++; } int-ar[numberLen]; 字符str[numberLen+1]; int i; 对于(i=0;i,c,arrays,string,return-value,C,Arrays,String,Return Value,我试图用C语言解决Euler项目的问题。我遇到了一个小问题,当我运行这个程序时,我得到了一个正方形,里面有一些数字,与字符串“100”相对 在代码中 #include<stdio.h> char* intToString(int N); int power(int N, int M) { int n = N; if (M ==0) return 1; int i; for( i = 1; i < M; i++) N*=n;

我试图用C语言解决Euler项目的问题。我遇到了一个小问题,当我运行这个程序时,我得到了一个正方形,里面有一些数字,与字符串“100”相对

在代码中

#include<stdio.h>

char* intToString(int N);
int power(int N, int M)
{   
    int n = N;
    if (M ==0) return 1;
    int i;
    for( i = 1; i < M; i++)
        N*=n;
    return N;
}

int main()
{
   printf("%s",intToString(100));
}

char* intToString(int N)
{   
   float M = N;
   int numberLen = 1;
   while(M > 1) 
   { 
      M /= 10;numberLen++;
   }
   int ar[numberLen];
   char str[numberLen + 1];
   int i;
   for(i = 0; i < numberLen; i++)
   {
      str[numberLen - i - 1] = (N%power(10,i+1))/(power(10,i));
   }
   str[numberLen] = '\0';
   return str; 
}
str
是函数的本地
intToString

如果尝试返回指向此数组的指针,并尝试使用调用方函数中的返回值,则当函数完成执行、数组停止存在且返回的指针呈现为无效时,它将进行调用。尝试使用无效内存将调用UB


您可以将
str
设为指针,并使用动态内存分配函数(如或family)为其分配内存。在这种情况下,即使函数完成执行,分配的内存的生存期仍然有效,直到显式地-d,并且使用返回值不是错误。

除了所建议的解决方案之外,您还可以将
char
数组从
main
传递到
intToString
。这将避免使用动态内存分配

 char str[numberLen + 1];

SnPrTNF在你的代码中非常有用,考虑使用二进制幂代替线性,它取O(Log2(n))时间,而不是O(n)(其中n是指数)。我应该更清楚!谢谢
char* intToString(int N, char* buffer);

...

int main()
{
   char buffer[20]; // Make it large enough for your need.
   printf("%s",intToString(100, buffer));
}

char* intToString(int N, char* buffer)
{
   // Replace use of str by buffer

   ...

   return buffer;
}