Ответ 1
Попробуйте этот патч
char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
printf("No line\n");
} else {
Я пытаюсь прочитать одну строку за раз, произвольной длины, из stdin в командной строке. Я не уверен, что смогу включить GNU readline и предпочитаю использовать библиотечную функцию.
Документация, которую я прочитал, предполагает, что getline
должен работать, но в моих экспериментах он не блокируется. Моя примерная программа:
#include <stdio.h>
int main()
{
char *line = NULL;
if (getline(&line, NULL, stdin) == -1) {
printf("No line\n");
} else {
printf("%s\n", line);
}
return 0;
}
создает No line
, что делает его непригодным для приема пользовательского ввода.
Как мне это сделать? Я знаю, что это должно быть тривиально, но я не смог понять это.
Попробуйте этот патч
char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
printf("No line\n");
} else {
Я смог воспроизвести "неблокирующее" поведение на getline
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *buffer;
size_t n = 1024;
buffer = malloc(n);
return getline(&buffer, &n, stdin);
}
getline(&buffer...
. Если я назначу NULL
на buffer
, он снова блокирует (как рекламируется) и сохраняет строку в недавно выделенном буфере.
Но если я пишу
getline(NULL, &n, stdin);
тогда getline
завершается сбой и, похоже, не блокируется. Вероятно, неверный n
или указатель файла может привести к такому же поведению. Возможно, это проблема?