我写了这个小函数来读取stdin
的所有数据。
我需要知道这个函数是否与POSIX兼容(据此,我的意思是它可以在Unix和类Unix系统下工作),至少它可以在Windows上运行...
char* getLine()
{
int i = 0, c;
char* ptrBuff = NULL;
while ((c = getchar()) != '\n' && c != EOF)
{
if ((ptrBuff = (char*)realloc(ptrBuff, sizeof (char)+i)) != NULL)
ptrBuff[i++] = c;
else
{
free(ptrBuff);
return NULL;
}
}
if (ptrBuff != NULL)
ptrBuff[i] = '\0';
return ptrBuff;
}
该函数从stdin读取所有数据,直到获得'\n'
或EOF
并返回指向包含所有字符的新位置的指针。我不知道这是否是最佳或更安全的方式,并且不知道这是否适用于Unix和类Unix系统......所以,我需要一些帮助。我该如何改进这个功能?或者是否有更好的方法从stdin
获取所有数据而不在缓冲区中留下垃圾?我知道fgets()
是一个选项但是,如果用户输入大于预期,它可能会留下垃圾......而且,我想获得用户编写的所有字符。
修改
新版getLine()
:
char* readLine()
{
int i = 0, c;
size_t p4kB = 4096;
void *nPtr = NULL;
char *ptrBuff = (char*)malloc(p4kB);
while ((c = getchar()) != '\n' && c != EOF)
{
if (i == p4kB)
{
p4kB += 4096;
if ((nPtr = realloc(ptrBuff, p4kB)) != NULL)
ptrBuff = (char*)nPtr;
else
{
free(ptrBuff);
return NULL;
}
}
ptrBuff[i++] = c;
}
if (ptrBuff != NULL)
{
ptrBuff[i] = '\0';
ptrBuff = realloc(ptrBuff, strlen(ptrBuff) + 1);
}
return ptrBuff;
}
最后编辑:
这是char* readLine()
函数的最终版本。现在我看不到更多的错误,也没有最好的改进方法,如果有人知道更好的方法,请告诉我。
char* readLine()
{
int c;
size_t p4kB = 4096, i = 0;
void *newPtr = NULL;
char *ptrString = malloc(p4kB * sizeof (char));
while (ptrString != NULL && (c = getchar()) != '\n' && c != EOF)
{
if (i == p4kB * sizeof (char))
{
p4kB += 4096;
if ((newPtr = realloc(ptrString, p4kB * sizeof (char))) != NULL)
ptrString = (char*) newPtr;
else
{
free(ptrString);
return NULL;
}
}
ptrString[i++] = c;
}
if (ptrString != NULL)
{
ptrString[i] = '\0';
ptrString = realloc(ptrString, strlen(ptrString) + 1);
}
else return NULL;
return ptrString;
}
答案 0 :(得分:1)
POSIX兼容:是的!
您只拨打getchar()
,malloc()
,realloc()
和free()
,所有这些都是
标准C功能,因此也可在POSIX下使用。据我所知,你已经完成了所有必要的返回代码检查。鉴于此,代码在支持malloc()
和stdin
的任何环境中都会很好。