Не верное обращение к памяти

Код компилируется, но: а) компилируется +- правильно только если вводить по символу, не слово целиком б) после первого cout в цикле while() появляется "мусор"? страшные символы, происхождение которых мне не совсем понятно

Код:

`   #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #pragma warning (disable : 4996)
    using namespace std;
    int main(void)
    {
        char *a;
        int n;
        cout << "Enter the number of words which you wanna enter (max:10)" << endl;
        cin >> n;
        cout << "Enter a few words: " << endl;
        a = new char[n];
        for (int i = 0; i < n; i++)
        {
            cin >> a[i];
        }
        const char* limits = " ;.,-()";
        char *pw;
        cout << "Words: " << endl;
        pw = strtok(a, limits);
        while (pw != NULL)
        {
            int b=atoi(pw);
            cout<<"\t" << pw << "\t" << endl;
            cout << "As numbers: \n\t" << b << endl;
            int c = (*max_element(a, a + n));
            cout << "Max element: " <<c<< endl;
            pw = strtok(NULL, limits);
        }
        return 0;
    }`

результат вывода:


Ответы (1 шт):

Автор решения: Надоедливый Пёс

В данной реализации у тебя есть одномерный массив символов, которому ты вручную задаёшь размеры. Вместо того чтобы создавать массив на 4 слова этот код создаёт массив на 4 символа. Почти любая функция в С++, обрабатывающая массивы символов работает до момента пока не встретит '\0'. Изначально массивы символов состоят целиком из ноль-символов, а после мы дописываем в начале наши новые значения. Для примера, если у нас был массив на 5 символов

"\0\0\0\0\0"

то после ввода 4 символов в начало строка будет выглядеть как

"help\0"

и функция cout будет выводить строку от первого символа и до момента пока не встретит \0. Но если мы вводим 5 символов, то строка принимает вид "helpm" и cout уже банально не понимает на каком моменте остановиться. И он начнёт выводить дальнейшие ячейки памяти пока не встретит '\0', что и произошло на скриншоте. Когда ты работаешь с массивом символов ты должен понимать, что у тебя ограничения по размеру не в n символов, а в n-1 символ.

Из-за того, что массив был ограничен размером в 4 символа и ты ввёл именно больше трёх символов - произошёл вывод непонятного "мусора"

→ Ссылка