我正在尝试创建一个新数组并将其覆盖在另一个数组中,但是在输出时,除了覆盖数组之外,还会将垃圾推入其中(数组 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;
}
在函数
get_string()之后s=malloc和s=realloc指针s必须检查为NULL。为避免最初频繁重新分配内存,请至少从
capacity=10.函数运行后,
get_string()长度等于输入的字符数,您忘记了符号'\0'。在函数中
obrabotka_size():您为 1 字节的数组 t 分配内存。然后在那里复制一个较长的字符串,这会导致未定义的行为,很可能是程序执行期间的错误。
复制循环进行,直到
size从键盘输入。如果初始行小于输入的值,那么至少 - 垃圾将被写入该行之后,作为最大值 - 读取时,您超出了分配的内存,这会导致程序的未定义行为。如果 size 小于原始字符串,则不复制字符串的末尾并且不复制字符'\0'。通过 分配
malloc和realloc释放的内存free(),而不是delete[]。并且为 2 个数组分配了内存,并释放了 1 个。嗯,函数中的小东西
obrabotka_size():*len但未使用int capacity = 1但未使用memcpy