gpt4 book ai didi

c - 从标准输入 C 读取所有数据

转载 作者:太空狗 更新时间:2023-10-29 15:40:40 24 4
gpt4 key购买 nike

我编写了这个小函数来从 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;
}

最佳答案

POSIX 兼容:是的!

您只调用了 getchar()malloc()realloc()free(),所有这些都是标准 C 函数,因此在 POSIX 下也可用。据我所知,您也完成了所有必要的返回代码检查。鉴于此,该代码在任何支持 malloc()stdin 的环境中都会很好。

关于c - 从标准输入 C 读取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com