真有心,代码写得有点古怪,总体思路倒是很清晰的,赞一个
我通常还是以实际使用为目的来考虑问题,就事论事的就你帖子最初的问题来说,可以非常非常简单地如下处理:
char* gets_safe()
{
const int LENGTH = 1024;
size_t len = 0;
char* ret = NULL;
char buffer[LENGTH + 1] = {0};
while( LENGTH != 0 ){
size_t iLen = 0;
if( fgets(buffer, LENGTH + 1, stdin) == NULL ){
buffer[0] = 0;
break;
}
iLen = strlen(buffer);
if(iLen != 0){
if( ret == NULL )
ret = (char*)malloc(iLen + 1);
else{
// 原来代码在这里准备使用 realloc() 函数
// 但发现 realloc() 函数对 C 运行时库有版本依赖
// 因此改成自己实现:
char* tmp = (char*)malloc(len + iLen + 1);
strncpy(tmp, ret, len);
free(ret);
ret = tmp;
}
strncpy(ret + len, buffer, iLen);
len += iLen;
ret[len] = 0;
}
if(buffer[iLen - 1] == 0x0A){
ret[len - 1] = 0;
break;
}
}
return ret;
}
对的,就一个函数。就把你需要的东西都完成了。
你可以看到我在函数里有一个常量 const int LENGTH = 1024,代码里初始化为 1024 是我认为常规情况下,这个大小足够做为输入缓存使用,这样,在这个大小之下,这个函数和常规的 C 运行时库里提供的函数做完全同样的工作。但一旦输入超过这个大小,这个函数就显示出比 C 运行时库更安全更完善的特点。
对于这个常量,你在使用时,也可以按照你最后那个代码里一个字节一个字节那样去分配,即写成:const int LENGTH = 1 也一样可以工作,缺点就是会导致不断调用 malloc() 函数,从而可能引起函数运行速度变慢、内存碎片增加的缺点。
另外,这个函数也是可以接收任意输入大小,直到电脑内存耗尽。这里有一点需要说明,就是函数内部分配的 buffer,在整个函数期间只分配了一次,函数执行完毕后,该内存自动返还给栈,不会导致内存碎片也不会导致性能损失,更不会对后续代码造成任何影响。
利用这个函数,对于你最初提的问题,就变得很简单了,再也不需要在使用前分配 char x[100] 这样的内存,直接可以这样使用:
char* p = gets_safe();