Одна главная проблема заключается в том, как вы читаете строку:
scanf("%s", &pstring[b])
Здесь pstring[b]
имеет тип char *
, и из-за вызова malloc
он указывает нанекоторая память (если только не произойдет сбой malloc
, который вы забудете проверить).
Но &pstring[b]
- это указатель на указатель и имеет тип char **
.Это вряд ли то, что вы хотите, и заставит scanf
записывать в память где-то, что не предполагалось записывать, и даже может записывать за пределы выделенной памяти.Это, конечно, приводит к неопределенному поведению .
Как только вы решите это, вы должны помнить, что char
строки в C действительно называются заканчивающиеся нулем строки байтов . null-terminator - это то, что все стандартные строковые функции ищут, чтобы найти конец строки.Конечно, это означает, что строка для x
символов требует места для x + 1
, чтобы соответствовать терминатору.Так что, если пользователь говорит, что он или она хочет строку длиной 6
(например), а затем вводит foobar
в качестве входных данных, ему нужно место для 7
символов с терминатором.Эта проблема терминатора (или, скорее, не хватает места для нее) у вас есть и в других местах (например, функция strcopy
).
Ваш scanf
вызов также не мешает пользователю ввестиСтрока длиннее, что сказал пользователь.Если пользователь сказал, что строка должна быть 3
символов, но затем введите foobar
, это будет писать за пределами.К сожалению, нет способа решить эту проблему только с scanf
, так как модификатор ширины поля должен быть частью строки формата.Вы можете использовать функцию scanf_s
, которая решает эту проблему, но она не обязательна для спецификации C и требует, чтобы вы определили конкретный макрос, чтобы он был доступен, если у реализации его есть (см. E..g thisscanf
и семейный номер для получения более подробной информации).В противном случае вам нужно программно сконструировать строку формата, включающую в себя ширину поля.
Вы также do free(pstring)
, что недопустимо, поскольку вы сами не выделяли pstring
, этомассив.Вам нужно перебрать все строки в массиве pstring
и free
их.Попытка передать указатель, не возвращенный malloc
(и др.), На free
также приводит к неопределенному поведению .
Наконец, в C вам не следует приводить результатиз malloc
(и связанных с ними функций) .