用动态申请内存的方法可以解决这个问题,有两种措施可以考虑:
设置一个循环,先动态申请一个较小的空间比如10字节,然后输入字符;当输入满时另外申请一个20字节的空间,把已输入的10个字符拷贝过来,释放掉10个字节的空间。然后向20个字节的空间里接着输入字符,写满时再申请一个30字符的空间……如此反复,直到输入'\n'时结束。
先动态申请一个较大的空间,如65535字节,直接向里输入字符,输入结束后测出长度,按实际需要另外申请一个空间把字符串拷贝过来,释放原来的空间。
措施1比较切合题意,但时效差,空间也不省(最后一瞬需要近二倍的空间)。措施2显得更有实际意义,因为“无限”的长度肯定是不存在的,所以取一个“够用”的大小临时用一下是可取的。下面提供措施2的参考代码:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "
stdio.h"
#include "
string.h"
#include "
stdlib.h"
#define N 65535
char *mygets(char *p){
char *ptmp;
if((ptmp=(char *)malloc(N))==NULL){//申请一个较大的临时用空间
printf("Application memory failure...\n");
exit(0);
}
gets(ptmp);//向临时空间直接输入字符串
if((p=(char *)malloc(strlen(ptmp)+1))==NULL){//按实际需要申请空间
printf("Application memory failure...\n");
exit(0);
}
strcpy(p,ptmp);//把字符串拷贝所需大小的空间里
free(ptmp);//释放临时空间
return p;
}
int main(void){
char *str=NULL;
printf("Input a string...\nstr=");
str=mygets(str);
printf("%s\n",str);
free(str);
return 0;
}