到现在为止,每当我想从 stdin 获取用户输入时,我都使用scanf()
,但这次我不能和 使用{{1 }}
通常,要使用read()
从 stdin 获取输入,我使用:
read
但这次我对输入没有任何长度限制,我想允许任意大小的输入。在过去,我使用了char buf[128];
read(0, buf, sizeof(buf));
,就像这样:
scanf
如何使用char *user_input;
scanf("%ms", &user_input);
执行此操作?
注意:此处的安全性并不重要
答案 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);
}