C ++の可変長のフォーマット文字列をstdinから読み取るにはどうすればよいですか?

2020-02-15 c++ io

このような愚かな質問には申し訳ありませんが、明らかな答えは見つかりませんでした。

最初にstdinから配列のサイズのint nを読み取り、次にn要素の「1 2 3 4 5 6」形式の文字列から整数値を読み取る必要があります。

コンパイル時にパラメーターの数がわかっていれば、 "%d %d %d %d %d %d"などのフォーマット文字列でscanf (または安全な代替手段)のようなものを使用できますが、ここではそれだけがわかります実行時の値。

C ++でこれを行う最良の方法は何ですか?パフォーマンスは重要ですが、その安全性以上のものです。

Answers

C ++の可変長のフォーマット文字列をstdinから読み取るにはどうすればよいですか?

あなたはそのようなことをしようとするべきではありません。常に一定の形式の文字列を使用してください。

私は最初にstdinから配列のサイズを持つint nを読み取り、次に整数値を読み取る必要があります

C ++でこれを行う最良の方法は何ですか?

一度に1つの値を読み取ります。ループを使用して繰り返します。

以下は、errorikaが説明することを行う関数です。

const int SIZE = //as much of your memory as you'd like the user to have access to
***caller function must include this:
   //allocate a string to hold some data;
    char* buffer = NULL;
    buffer = malloc (SIZE * sizeof(char));
    if (buffer == NULL) {
        printf("malloc error terminating\n");
        return;
    }
***
void getEntry(char* buffer) {
    int count = 0;
    int maxlen = SIZE - 1;
    char a = '0';
    for (int i = 0; i < SIZE; i++) {
        buffer[i] = '0';
    }

    while (a != '\n' && count < maxlen) {
            a = fgetc(stdin);
            buffer[count] = a;
            count++;
    }
    if (a == '\n') {
        buffer[count - 1] = '\0';
    }
    else {
        buffer[count] = '\0';
        do {
                a = fgetc(stdin);
        } while (a != '\n');
    }
}

これはすべて基本的なCコードですが、ユーザー入力は悪意があります。 C ++の慣用的なユーザー入力関数を作成するために私が考え出したのは次のとおりです(クエリは単に渡すメッセージ文字列です)。

template<typename T>
void getInput(const std::string query, T& entry) {
    std::string input;
    std::cout << query << std::endl;
    getline(std::cin, input);
    std::stringstream buffer{input};
    buffer >> entry;
}

または

template<typename T>
void getInput2(std::string query, T& entry) {
    bool validInput = false;
    while (validInput == false)
    { 
        validInput = true;
        std::cout << query << std::endl;
        std::cin >> entry;
        if (std::cin.fail()) {
            validInput = false;
            std::cout << "Unacceptable entry\n" << std::endl;
        }
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

Related