36

コマンドラインのstdinから、任意の長さの1行を一度に読み取ろうとしています。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ます。これにより、ユーザー入力の受け入れには不適切になります。

どうすればよいですか?些細なことだとは思いますが、理解できませんでした。

4

2 に答える 2

67

このパッチを試してください

char *line = NULL;
+size_t size;
+if (getline(&line, &size, stdin) == -1) {
-if (getline(&line, 0, stdin) == -1) {
    printf("No line\n");
} else {
于 2012-09-03T17:49:56.353 に答える
7

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...ブロック。に割り当てるNULLbuffer、再びブロックされ(アドバタイズされたとおり)、新しく割り当てられたバッファに行が格納されます。

しかし、私が書くなら

getline(NULL, &n, stdin);

その後getline失敗し、ブロックされていないようですおそらく、無効なnポインタまたはファイルポインタも同じ動作を引き起こす可能性があります。これが問題になるのでしょうか?

于 2012-09-03T17:51:17.600 に答える