
C/C++
Откуда взялся мусор в динамическом массиве char?
Я занимаюсь по учебнику Страуструпа и когда в функции strdup1 создаю динамический массив, то там лишний мусор (выделил) (хотя я даже размер массива указал через strlen() )


А что вы хотели, в динамических массивах всего будет мусор. Их надо самостоятельно обнулять.
Просто вместо strlen(t) напишите везде strlen(t) + 1. На самом деле строка состоит из strlen(t) + 1 символов: strlen(t) буков и +1 последний - символ нуль-терминатор '\0', обозначающий конец строки.
У вас копирование одного массива в другой. Обнулять t1 не обязательно, потому что в массив t1 данные запишутся поверх тех, что уже были (t1[i] = t[i]). А если нужно обнулить строку (массив char) то один из способов это t1[0] = '\0'
Просто вместо strlen(t) напишите везде strlen(t) + 1. На самом деле строка состоит из strlen(t) + 1 символов: strlen(t) буков и +1 последний - символ нуль-терминатор '\0', обозначающий конец строки.
У вас копирование одного массива в другой. Обнулять t1 не обязательно, потому что в массив t1 данные запишутся поверх тех, что уже были (t1[i] = t[i]). А если нужно обнулить строку (массив char) то один из способов это t1[0] = '\0'
Виталий Фризен
Обнулять или создать специальную переменную, которая будет отвечать за "искусственные" границы?
Страуструп не умеет правильно готовить свой язык. Вернее, не понимает, что людей надо учить правильно его готовить. И твой код - это скорее код на Си, приправленный сахаром из C++. new тут тоже в роли сахара.
Такой подход годится программисту микроконтроллеров, там так пишут, там все равно STL нету.
Но такой программист не является профессионалом именно C++, и не может им работать.
И я это не просто так говорю. Если использовать более новый способ - не динамический массив, а vector (из STL) - то такой проблемы не будет. Вектор основан на динамическом массиве, но автоматически делает всю грязную работу.
Такой подход годится программисту микроконтроллеров, там так пишут, там все равно STL нету.
Но такой программист не является профессионалом именно C++, и не может им работать.
И я это не просто так говорю. Если использовать более новый способ - не динамический массив, а vector (из STL) - то такой проблемы не будет. Вектор основан на динамическом массиве, но автоматически делает всю грязную работу.
Денис Костенко
Страуструп уверен что ты петух)))))))))))))))
Кайрат Шакенов
он учится пока. Пусть тренируется через ВСЕ понятия
Кайрат Шакенов
из книги страуструпа как-то набросал пример... И что? Куча ошибок. Запустить не удалось ибо замотался исправлять
для начала вместо std:: сразу перед main() напиши using namespace std; и больше никаких std::
Дамир Толемис
на будущее выкладывай на pastbin, чтобы сразу нв компе посмотреть ЧТО за мусор
Дамир Толемис
код пришли тогда видно будет ЧТО исправить и как
Я конечно же сомневаюсь, но попробуйте из чистого любопытства завершить строковую константу "Hello,World!" символом \0.
Типы char* и char[] совместимы, но не идентичны!
Типы char* и char[] совместимы, но не идентичны!
Дмитрий Филиппов
А!!! Ваша ошибка в инициализации переменной t1. Прав Noname, памяти требуется на 1 больше чем strlen(t).
Дмитрий Филиппов
В функции strdup1 лучше всего вызывать функцию memcpy или memmove — строка скопируется разом.
А в функции findx не требуется переменная counter, достаточно такого условия цикла: *s != '\0'
И добавьте, пожалуйста, ещё один return, иначе функция может вернуть непредвиденный результат!
А в функции findx не требуется переменная counter, достаточно такого условия цикла: *s != '\0'
И добавьте, пожалуйста, ещё один return, иначе функция может вернуть непредвиденный результат!
Дмитрий Филиппов
Зачем вызывать функцию strlen несколько раз? Это не рационально! Внутри себя функция strlen проходит по всем символам строки, подсчитывая их количество, другого способа определить длину строки по указателю на неё не существует!
Почему бы не определить длину строки только один раз, сохранив это число во вспомогательной переменной???
Почему бы не определить длину строки только один раз, сохранив это число во вспомогательной переменной???
Дмитрий Филиппов
for (int i = 0; word[i] != '\0'; i++) std::cout << word[i];
Внимание на условие цикла!
Внимание на условие цикла!
Похожие вопросы
- Устройство статических и динамических массивов в оперативной памяти (...)
- Двумерный динамический массив с неизвестны количеством столбиков или строк
- Почему динамический массив напрямую в функцию передать нельзя, а динамический массив указателей можно?
- Динамический массив и указатель Си
- Задача по С++ ДИНАМИЧЕСКИЙ МАССИВ
- C++ динамический массив
- Программирование на C++ с использованием динамического массива
- C++ Одномерный динамический массив
- Размер динамического массива, передаваемого в функцию в C++.
- Как работать с элементами динамического массива из функции?