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 用于填充。试试这个,看看你是否走得更远。