Не верное обращение к памяти
Код компилируется, но:
а) компилируется +- правильно только если вводить по символу, не слово целиком
б) после первого 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 символа и ты ввёл именно больше трёх символов - произошёл вывод непонятного "мусора"
