如何使用read()从stdin

时间:2017-08-30 11:31:27

标签: c input scanf

到现在为止,每当我想从 stdin 获取用户输入时,我都使用scanf(),但这次我不能和 使用{{1 }}

通常,要使用read() stdin 获取输入,我使用:

read

但这次我对输入没有任何长度限制,我想允许任意大小的输入。在过去,我使用了char buf[128]; read(0, buf, sizeof(buf)); ,就像这样:

scanf

如何使用char *user_input; scanf("%ms", &user_input); 执行此操作? 注意:此处的安全性并不重要

2 个答案:

答案 0 :(得分:1)

函数read返回读取字节数。您可以利用此信息并循环,直到您读取0个字节,即read返回0.

char buf[BUF_SIZE]; // Set BUF_SIZE to the maximum number of character you expect to read (e.g. 1000 or 10000 or more).
int bytes_to_read, total_read_bytes, read_bytes;

// Number of bytes to read at each iteration of the loop.
bytes_to_read = 128;

// The following variable counts the number of total read bytes. 
total_read_bytes = 0;

while ((read_bytes = read(0, buf + total_read_bytes, bytes_to_read) != 0) {

    if (read_bytes < 0) {
        // read() may return -1. You can look at the variable errno to
        // have more details about the cause of the error.
        return -1;
    }

    total_read_bytes += read_bytes;
}

请注意read 会自动将空终结符\0附加到buf,也就是说,buf不是字符串,直到您在其末尾显式添加\0

...
// Making buf a string.
buf[total_read_bytes] = '\0';
...

答案 1 :(得分:-3)

一种方法是使用getchar()函数运行循环并将字符保持为数组。每次迭代检查数组大小,一旦数组已满,请将其重新分配到更大的大小。或者使用getline()函数。 getline()

的链接

检查以下程序。

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    char *lines = NULL;
    size_t n = 0;
    ssize_t res = getline(&line, &n, stdin);
    free(line);
}