c ++在没有return新指针的情况下增加指针大小
c++ Increase pointer size without return new pointer
我的老师让我完成了这个(主要部分被隐藏了),我想知道为什么这个解决方案会出现无限循环。
任务:
完成这个功能:
void pad_left(char *a, int n) {
}
// if length of a greater than n, do nothing
// else insert '_' util a 's length is n
有些情况下我遇到了段错误
我尝试 realloc 但它 return new ptr
我的解决方案
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void printChar(char *a) {
int i = 0;
while(a[i] != '[=12=]') cout << a[i];
cout << endl;
}
void insert_begin(char *a, int n) {
for(int i = n; i > 0; i--) {
a[i] = a[i-1];
}
a[n+1] = '[=12=]';
}
void pad_left(char *a, int n) {
int len = n - strlen(a);
for(int i = 0; i < len; i++) {
insert_begin(a, strlen(a));
}
}
这是完整代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void printChar(char *a) {
int i = 0;
while(a[i] != '[=13=]') cout << a[i];
cout << endl;
}
void insert_begin(char *a, int n) {
for(int i = n; i > 0; i--) {
a[i] = a[i-1];
}
a[n+1] = '[=13=]';
}
void pad_left(char *a, int n) {
int len = n - strlen(a);
for(int i = 0; i < len; i++) {
insert_begin(a, strlen(a));
}
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
char a[5] = "test";
pad_left(a, 10);
printChar(a);
return 0;
}
好的,你需要一些背景信息。
void pad_left(char *a, int n) {
}
char a[5] = "test";
pad_left(a, 10);
这将是一个严重的问题。首先,您不能重新分配有两个原因。首先,char a[5] 是一个固定数组——而不是分配数组。当您将它传递给 pad_left 时,它不会改变。 realloc() 释放旧指针,但你不能那样做,它会导致问题。因此,除非您确保字符串来自分配的内存,否则您不能在解决方案中使用 realloc。你不能这样假设。
所以把realloc放在一边。你不能用那个。
接下来,char a[5]只分配5个字节。如果您开始编写超出该范围的内容(通过将 10 传递给您的方法),您将踩到其他地方。这绝对是糟糕的。
所以...没有测试,您的其余代码似乎是合理的。如果你这样做,你可能会得到一个好的测试:
char a[100] = "test";
pad_left(a, 10);
您将分配大量 space 用于填充。试试这个,看看你是否走得更远。
我的老师让我完成了这个(主要部分被隐藏了),我想知道为什么这个解决方案会出现无限循环。 任务: 完成这个功能:
void pad_left(char *a, int n) {
}
// if length of a greater than n, do nothing
// else insert '_' util a 's length is n
有些情况下我遇到了段错误 我尝试 realloc 但它 return new ptr 我的解决方案
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void printChar(char *a) {
int i = 0;
while(a[i] != '[=12=]') cout << a[i];
cout << endl;
}
void insert_begin(char *a, int n) {
for(int i = n; i > 0; i--) {
a[i] = a[i-1];
}
a[n+1] = '[=12=]';
}
void pad_left(char *a, int n) {
int len = n - strlen(a);
for(int i = 0; i < len; i++) {
insert_begin(a, strlen(a));
}
}
这是完整代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
void printChar(char *a) {
int i = 0;
while(a[i] != '[=13=]') cout << a[i];
cout << endl;
}
void insert_begin(char *a, int n) {
for(int i = n; i > 0; i--) {
a[i] = a[i-1];
}
a[n+1] = '[=13=]';
}
void pad_left(char *a, int n) {
int len = n - strlen(a);
for(int i = 0; i < len; i++) {
insert_begin(a, strlen(a));
}
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
char a[5] = "test";
pad_left(a, 10);
printChar(a);
return 0;
}
好的,你需要一些背景信息。
void pad_left(char *a, int n) {
}
char a[5] = "test";
pad_left(a, 10);
这将是一个严重的问题。首先,您不能重新分配有两个原因。首先,char a[5] 是一个固定数组——而不是分配数组。当您将它传递给 pad_left 时,它不会改变。 realloc() 释放旧指针,但你不能那样做,它会导致问题。因此,除非您确保字符串来自分配的内存,否则您不能在解决方案中使用 realloc。你不能这样假设。
所以把realloc放在一边。你不能用那个。
接下来,char a[5]只分配5个字节。如果您开始编写超出该范围的内容(通过将 10 传递给您的方法),您将踩到其他地方。这绝对是糟糕的。
所以...没有测试,您的其余代码似乎是合理的。如果你这样做,你可能会得到一个好的测试:
char a[100] = "test";
pad_left(a, 10);
您将分配大量 space 用于填充。试试这个,看看你是否走得更远。