在不使用 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
([]}
我正在尝试使用函数 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
([]}