#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;
}
我正在尝试解决C中的Euler项目问题。我在这里遇到了一个小问题,当我运行这个程序时,我得到一个带有一些数字的正方形,而不是字符串“100”。
答案 0 :(得分:3)
在您的代码中,
char str[numberLen + 1];
str
是您的函数intToString
的本地。
如果您尝试返回指向此数组的指针并尝试使用调用函数中的返回值,它将调用undefined behavior,因为当函数完成执行时,数组将不再存在并返回指针呈现无效。尝试使用无效内存调用UB。
您可以使str
成为指针并使用动态内存分配函数(如malloc()
或family)为其分配内存。在这种情况下,即使函数完成执行,分配的内存的生命周期仍然有效,直到free()
- d显式并且使用返回值不是错误。
答案 1 :(得分:0)
除the other answer建议的解决方案外,您还可以将char
的数组从main
传递到intToString
。这将避免使用动态内存分配的需要。
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;
}