在不使用 lib 函数的情况下将字符串复制为空字符串

Copying a string into an empty string without using a lib function

我正在尝试使用函数 push[= 将字符串 p 复制到空字符串 stack 26=]。我不想使用任何其他函数,如 strcpy 或 concat。

#include<bits/stdc++.h>
using namespace std;

int tos=0;

void push(char *stack, char c)
{
    stack[tos++]=c;
}

int main()
{
    int i;
    char p[]="([]}";
    char stack[]="";

    for(i=0;i<strlen(p);i++)
        push(stack,p[i]);
    
    cout<<"length="<<strlen(stack)<<"\n";

    cout<<stack;
    
    return 0;
}

但是输出结果是

length=5
([]}}

我不明白为什么新字符串stack的长度在复制原始字符串时变成了5 from 的长度为 4。另外,为什么最后一个字符 } 在输出中 stack 的末尾重复?

您发现了为什么 C++ 如此简单,std::string。手动执行此操作,老式的方法充满危险。新方法就是stack = p;字面意思,就是这么简单

stack 在您的代码中不是“空字符串”。这是一个char[1]。您不能 将任何字符复制到其中,因为需要一个字符来保存 [=14=]。与 std::string 不同,C 数组具有固定长度。

您需要分配 stack 变量,例如使用 malloc;

int main()
{
    int i;
    char p[]="([]}";
    char* stack;
    stack=(char*)malloc((strlen(p)+1)*sizeof(char));
    
    int len = strlen(p);
    for(i=0;i<len;i++){
         push(stack,p[i]);
    }

    // if you use char*, you need to end it with `[=10=]`
    push(stack, '[=10=]');
    cout<<"length="<<strlen(stack)<<"\n";

    cout<<stack;
    //do not forget to deallocate
    free(stack);
    return 0;
}

在 C 中使用它之前,您需要分配要在堆栈上使用的必要 space。实际上,在编译时,编译器无法知道您希望在 [= 中存储的大小12=]变量。

输出将是

length=4
([]}

您声明了一个字符数组,其中一个元素的值为 '[=13=]'

char stack[]="";

数组具有固定大小,在其生命周期内无法更改。

因此,要么您需要使用标准容器或容器适配器(例如,您可以使用 std::stack<char>std::string),要么您需要自己为堆栈的元素分配内存。否则你的程序有未定义的行为,因为数组堆栈之外的内存正在被覆盖。

至于你的方法,那么它应该模拟如下内容

#include <iostream>
#include <cstring>

size_t top = 0;

void push( char * &stack, char c )
{
    char *tmp = new char[top + 2];
    
    for ( size_t i = 0; i < top; i++ ) tmp[i] = stack[i];
    
    delete [] stack;
    
    stack = tmp;
    
    stack[top] = c;
    stack[++top] = '[=11=]';
}

int main() 
{
    const char *p = "([]}";
    char *stack = new char[1] { '[=11=]' };
    
    for ( const char *tmp = p; *tmp; ++tmp ) push( stack, *tmp );
    
    std::cout << std::strlen( stack ) << '\n';
    std::cout << stack << '\n';
    
    delete [] stack;
    
    return 0;
}

程序输出为

4
([]}