我只是编写了一个像IntegerToString
一样使用递归的函数,但GCC刚刚出现
"its.c: In function ‘ITS’:
its.c:26:3: warning: initialization makes integer from pointer without a cast [enabled by default]
its.c:26:3: warning: (near initialization for ‘buffer[0]’) [enabled by default]
its.c:26:3: warning: initialization makes integer from pointer without a cast [enabled by default]
..."
我不知道如何解决它。请帮助我。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *Change(char *buffer,int n)
{
if(n==0){
return(buffer);
}else{
int left=n%10;
n=n/10;
int len=strlen(buffer);
buffer[len-1]='\0';
char new_array[30]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
printf("%s\n",new_array);
new_array[0]=left+'0'; printf("NEW:%s\n",new_array);
strcat(new_array,buffer); printf("TEST:%s\n",new_array);
return(Change(new_array,n));
}
}
char *ITS(int n)
{
char buffer[30]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};;
return(Change(buffer,n));
}
int main()
{
int n=1729;
char *buffer=(char*)malloc(30*sizeof(char));
if(buffer==NULL)
{
printf("Malloc Fault!\n");
exit(-1);
}
buffer=ITS(1729);
printf("%s\n",buffer);
return 0;
}
答案 0 :(得分:2)
正如评论中指出的那样,使用和从函数返回本地存储是不安全的。更改ITS()和Change()的签名,以便从main()中获取缓冲区:
char * Change(char * srcBuffer, int n) ;
char * ITS( char * srcBuffer, int n) ;
int main()
{
int n= 1729 ;
char buffer[30] ;
printf("%d = %s\n", n, ITS( buffer, n)) ;
}
如果你很聪明,那么你可以让Change返回与ITS不同的值,并用它来告诉每个级别下一个数字的位置。
如果您的ITS签名受限(请参阅注释),请在ITS中使用静态内存。它不是线程安全的,但它会起作用:
char * Change(char * srcBuffer, int n) ;
char * ITS( int n )
{
static char buffer[30] = { 0 } ;
return Change( buffer, n) ;
}
int main()
{
int n= 1729 ;
printf("%d = %s\n", n, ITS( n)) ;
}
答案 1 :(得分:0)
不要用NULL初始化字符数组(即使NULL实际上是...... 0或When was the NULL macro not 0?)。 NULL用于表示指针指向“无”。如果要使用0初始化数组,可以使用memset(C样式):
BUFFER_LEN = 30;
memset(buffer, 0, sizeof(*buffer)*BUFFER_LEN);