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

5 c unix stdin posix getchar

我编写了这个小函数来读取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;
}
Run Code Online (Sandbox Code Playgroud)

该函数从 stdin 读取所有数据,直到 get '\n'orEOF并返回一个指向新位置的指针,其中包含所有字符。我不知道这是否是最好的或更安全的方法,也不知道这是否适用于 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;
}
Run Code Online (Sandbox Code Playgroud)

最后编辑:

这是该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;
}
Run Code Online (Sandbox Code Playgroud)

use*_*114 4

POSIX 兼容:是的!

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