Нужно сделать запись одного массива в другой массив меньшей длины
Пытаюсь создать новый массив и перезаписать в другой массив, но при выводе помимо перезаписи массива пихает в него мусор(массив t) Функциями работой со строками пользоваться нельзя. Программированием занимаюсь всего неделю, если ещё будут комментарии к написанию кода, то пишите.
#include <iostream>
using namespace std;
char* get_string(int* len) {
int capacity = 1;
char* s = (char*)malloc(sizeof(char));
char c = getchar();
while (c != '\n') {
s[(*len)++] = c;
if (*len >= capacity) {
capacity *= 2;
s = (char*)realloc(s, capacity * sizeof(char));
}
c = getchar();
}
s[*len] = '\0';
return s;
}
char* obrabotka_size(int* len,char* f1,int size) {
int capacity = 1;
char* t = (char*)malloc(sizeof(char));
for (int i = 0; i < size;i++){
t[i] = f1[i];
}
cout << "\nt=" << t;
return t;
}
int main() {
int size=0;
setlocale(LC_ALL, "RUSSIA");
int len=0;
char* f1 = get_string(&len);
cout << "\nf1=" << f1;
cout << "\nSIZEOF: " << sizeof(f1);
cout << "\nSize stroki: ";
cin >> size;
char* f2 = obrabotka_size(&len,f1,size);
cout << "\nf2=" << f2 << endl;
cout << "\nf1=" << f1 << endl;
delete[] f1;
return 0;
}
Ответы (1 шт):
В функции get_string() после s=malloc и s=realloc указатель s нужно проверять на NULL.
Чтобы избежать первоначального частого реаллокейта памяти начните хотя бы с capacity=10.
После работы функции get_string() длина равна количеству символов введенных, вы забыли про символ '\0'.
В функции obrabotka_size():
Вы выделяете память под массив t в размере 1 байт. И потом туда копируете более длинную строку, что вызывает неопределенное поведение, скорее всего ошибку при выполнении программы.
Копирование идет в цикле до size, введенный с клавиатуры. Если первоначальная строка меньше введенного значения, то как минимум - после строки запишется мусор, как максимум - при чтении вы выходите за пределы выделенной памяти что приводит к неопределенному поведению программы. Если size меньше первоначальной строки, то концовка строки не копируется и не копируется символ '\0'.
Память выделенную через malloc и realloc освобождают при помощи free(), а не delete[]. И выделяется память под 2 массива, а освобождается 1.
Ну и по мелочи в функции obrabotka_size():
- передается
*len, но не используется - объявляется
int capacity = 1,но не используется - вместо цикла с копированием лучше использовать функцию
memcpy