Почему scanf () не меняет строку после ввода? - PullRequest
0 голосов
/ 16 марта 2020

Я хочу ввести что-то вроде

1
3
1 2 3
4 5 6
7 8 9

Но с этим кодом

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        vector <int> k, a, s;
        for (int i = 0; i < n; ++i)
        {
            scanf("%d", &k[i]);
        }
        for (int i = 0; i < n; ++i)
        {
            scanf("%d", &a[i]);
        }
        for (int i = 0; i < n; ++i)
        {
            scanf("%d", &s[i]);
        }
        for (int i = 0; i < n; ++i)
        {
            printf("%d %d %d", (int)k[i], (int)a[i], (int)s[i]);
        }
    }
}

Я могу только ввести

1
3
1 2 3

scanf () не изменяется строки после первой для l oop. Как мне принять все входные данные?

1 Ответ

3 голосов
/ 16 марта 2020

У вас есть ошибка в этом l oop:

    vector <int> k, a, s;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &k[i]);
    }

В момент запуска этого l oop вектор k пуст. В результате &k[i] является указателем на место в памяти, которое не является частью вектора k, что приводит к неопределенному поведению. То же самое относится и к другим циклам.

Если вы хотите использовать scanf таким образом, убедитесь, что изменили размеры своих векторов перед чтением в них. Например, вы можете объявить их как

vector<int> k(n), a(n), s(n);

, чтобы убедиться, что они имеют правильный размер.

Кроме того, не забудьте проверить возвращаемое значение scanf, чтобы убедиться, что чтения завершаются успешно - если бы проблема действительно была в scanf, было бы неплохо локализовать ошибку.

...