как мне настроить `stdin` для чтения из строки c ?

#c #stdin #stress-testing

#c #stdin #стресс-тестирование

Вопрос:

рассмотрим функцию cpp solve() . Строка a чисел (пример тестовой строки) передается функции solve() в качестве аргументов. Я хотел stdin прочитать числа в строке a .

На самом деле это стресс-тест. Итак, в этом стресс-тесте этой функции solve() предоставляется строка с return результатом, который будет проверен на соответствие другому результату, полученному из другой функции solveFast() .

ПРИМЕЧАНИЕ: — Алгоритм в функции solve() уже предоставлен нам. Я хочу провести стресс-тестирование этого алгоритма на основе моего собственного алгоритма (in solveFast() ). Гарантируется, что алгоритм в функции solve() обеспечивает корректный вывод по сравнению с его тестовыми входными данными

 #include <bits/stdc  .h>

using namespace std;

int solve(string s) {
    // below given: an algorithm that 
    //uses stdin to take input sample test case (i.e.,not string s)
    int n; //number of integers in string s

    //ignore the purpose of the code below. 
    //Just observe that it is taking the inputs as cin (not from string s.
    cin >> n;
    int first, second, large; 
    for (int i = 0; i < n - 1; i  ) {
        if (i == 0) {
            cin >> first >> second;
            large = (second > first) ? second : first;
            if (second < first) first = second;
        } else {
            cin >> second;  // new num
            if (second > large) {
                first = large;
                large = second;
            }
            else if(second > first){
                first = second;
            }
        }
    }
    int result = large * first;

    return resu<
}
int solveFast(string s) {
    
    /*
     * my solution here
     */

    return resu<
}

int32_t main() {

    //stress-testing code starts here
    while (true) {
        
        string a;

        /*
         * generating a sample test case and storing it in a string 'a'
         */

        int res1 = solve(a);
        int res2 = solveFast(a);
        if(res1!=res2){
            cout << "Wrong answer: " << res1 << " " << res2 << endl;
            break;
        }
        else{
            cout << "OKn";
        }
    }
    //stress-testig code ends

    /*
    for (int i = 1; i <= t;   i) {
        int n;
        cin >> n;
        vector<int> numbers(n);
        for (int i = 0; i < n; i  ) {
            cin >> numbers[i];
        }
        auto result = solve(numbers);
        cout << result << endl;
    }
    */

    return 0;
}

  

Комментарии:

1. std::stringstream имеет >> оператор точно так же, как std::cin имеет

Ответ №1:

Передайте a std::istream в вашу функцию, а затем создайте istream из строки. Как правило, не используйте глобальные переменные (например std::cin ) в коде, который предназначен для модульного тестирования.

 #include <sstream>
#include <iostream>
int solve(std::istreamamp; input, std::string s) {
     std::string variable;
     input >> variable;
     return 0;
}
void unit_test_solve() {
     std::istringstream input("some string");
     solve(input, "bla");
}
int real_code() {
     solve(std::cin, "bla");
}
  

Комментарии:

1. в строке 3 мы можем написать std::istringstreamamp; input вместо std::istreamamp; input ? Я знаю, что istringstream это контейнер… но как насчет istream ? Это istream тоже контейнер? извините за этот глупый вопрос … но мне нужно знать … пожалуйста, пожалуйста, объясните немного..

2. Я не понимаю. Пожалуйста, изучите, как и что такое наследование. Нет, вы не можете писать solve(std::istringstreamamp; , потому std::cin что это std::istream тип и std::istream не наследуется от std::istringstream . Is istream a container too? Ну, я бы сказал, что оба являются «потоками». cppreference I / O — отличный ресурс, но я рекомендую хорошую книгу по C .