C-字符推送和弹出操作[关闭]
Posted
技术标签:
【中文标题】C-字符推送和弹出操作[关闭]【英文标题】:C- Character Push and Pop operation [closed] 【发布时间】:2018-06-12 16:31:06 【问题描述】:Stack create(int c)
Stack S=(Stack)malloc(sizeof(struct stack));
S->size=c;
S->top=-1;
S->array=(char *)malloc(sizeof(char)*c);
return S;
Stack makeEmpty(void)
Stack *S1=create(100);
S1[0]->top=-1;
return S1;
char pop(Stack S)
return S->array[S->top--];
;
int main(void)
Stack *S1;
S1=makeEmpty();
int j;
int k=0;
char result[30];
for(j=0; j<2; j++)
char result1=pop(S1);
strcat(result, result1);
k++;
我跳过了一些部分,比如typedef struct stack Stack
;
我想做的是在 for 循环工作时从堆栈中弹出元素。然后,将这些元素存储在一个新数组result
中。为了检查它是否有效,我打印出来但我遇到了运行时错误。如何存储元素以及如何打印出来?
【问题讨论】:
欢迎来到 Stack Overflow。请尽快阅读About 和How to Ask 页面,但更迫切地关注如何创建 MCVE (minimal reproducible example)。 “我有一个运行时错误”是对出错原因的骇人听闻的解释。到底发生了什么,你输入了什么?您显示的代码没有定义结构类型,也没有显示如何推送数据。大多数情况下,您应该预先递减堆栈指针,但这取决于...问题很可能出在您未显示的代码中,就像您显示的代码中一样。 我不明白你在问什么。此外,strcat
的签名是char *strcat(char *dest, const char *src);
。你传递了一个char
,你的编译器一定警告过你。
您的pop()
函数如何告诉您没有要弹出的字符?你还没有展示事情是如何被推送的,但我确实看到你在top
中有一个空堆栈的-1
,所以S->top--
不一定是错误的。
在makeEmpty
你有一个语法错误,S1[0]->top=-1;
是错误的,应该是S1[0].top=-1;
。你在发布之前编译你的东西吗?你读过编译器错误吗?此外,这样做毫无意义,create
调用已经将-1
分配给top
。
两个都试了,但是 S1[0].top=-1 编译出错了。
【参考方案1】:
我已经复制并粘贴了您的代码,但它没有被编译。我觉得 您要么不发布实际代码,要么不费心编译和阅读编译器警告。帮助你是相当困难的。以下是我注意到的一些事情:
1。
create
必须返回指向 Stack
的指针,而不是对象。
Stack *create(int c)
Stack *S = malloc(sizeof *S);
S->size=c;
S->top=-1;
S->array = malloc(c);
return S;
2。
makeEmpty
也是如此
Stack *makeEmpty(void)
Stack *S1=create(100);
S1->top=-1;
return S1;
3。
pop
应该得到一个指向 Stack
的指针,而不是对象
char pop(Stack *S)
return S->array[S->top--];
;
在这里您应该检查堆栈中是否有元素。 int pop(Stack *S, char *val)
返回 1 并在 *val
上写入
成功,返回 0 否则会更好。
4。
从您的pop
来看,您只是在推动char
。我不明白你的意思
正在尝试处理strcat
。无论哪种方式,你都做错了strcat
。你
正在声明一个包含 100 个空格的堆栈,但您只声明了 30 个空格
为result
。如果堆栈中有超过 31 个元素怎么办?我知道
您只检查 2 个元素,但很容易忽略这一点并且
扩展它以遍历所有堆栈而不改变内存要求
为result
。
另外,strcat
是一个适用于 C-Strings 的函数,这意味着它期望
C弦。 C 字符串 必须 以 \0
终止,而您的则不是。你有
看起来像 C-String 但不是的东西。如果你坚持使用
strcat
,你应该这样做:
for(j=0; j<2; j++)
char result1[] = pop(S1), 0 ;
strcat(result, result1);
【讨论】:
以上是关于C-字符推送和弹出操作[关闭]的主要内容,如果未能解决你的问题,请参考以下文章