1

Cでは、char *fgets(char *s, int size, FILE *stream)関数を使用してstdinからユーザー入力を読み取ることができます。ただし、ユーザー入力のサイズはに制限されていsizeます。可変サイズのユーザー入力を読み取るにはどうすればよいですか?

4

2 に答える 2

1

この関数は、標準入力からファイルの終わりに到達するまで読み取り、読み取られた文字数を返します。正確に1行などを読み取るように変更するのはかなり簡単なはずです。

ssize_t read_from_stdin(char **s)
{
    char buf[1024];
    char *p;
    char *tmp;

    ssize_t total;
    size_t len;
    size_t allocsize;

    if (s == NULL) {
        return -1;
    }

    total = 0;

    allocsize = 1024;
    p = malloc(allocsize);
    if (p == NULL) {
        *s = NULL;
        return -1;
    }

    while(fgets(buf, sizeof(buf), stdin) != NULL) {
        len = strlen(buf);

        if (total + len >= allocsize) {
            allocsize <<= 1;
            tmp = realloc(p, allocsize);
            if (tmp == NULL) {
                free(p);
                *s = NULL;
                return -1;
            }

            p = tmp;
        }

        memcpy(p + total, buf, len);
        total += len;
    }       

    p[total] = 0;
    *s = p;

    return total;
}
于 2013-02-03T12:30:26.660 に答える
1

Cでは、バッファとそのサイズを担当します。したがって、動的バッファを用意することはできません。したがって、唯一の解決策はループを使用することです(fgetsまたはfgetcのいずれか-処理と停止条件によって異なります)

CからC++に移行すると、可変サイズのstd :: stringオブジェクトを受け入れることができることがわかります(代わりに単語や行の終了を処理する必要があります-そしてもう一度ループします)

于 2013-02-03T12:30:39.327 に答える