c - 后缀符号的堆栈和弹出帮助。打印错误的值,C prog
问题描述
我的代码接受 1 个命令行参数,它逐个字符地读取命令行并相应地放置堆栈。
命令行参数:“12+”应该等于等式“1+2”
int pop(stack *p);
int main(int argc, char **argv)
{
stack ph;
int i, a, b;
int val = 0;
if (argc!=2)
{
printf("Usage: %s argument\n", argv[0]);
exit(1);
}
else{
int i;
int length = strlen(argv[1]);
int count;
initializedStack(&ph);
for(i=0;i<length;i++)
{
if (argv[1][i] == '+'){
a = pop(&ph);
printf("%d\n", a);
b = pop(&ph);
printf("%d\n", b);
val = a+b;
push(&ph,val);
}
else{
push(&ph, argv[1][i]);
}
}
printf("%d\n", pop(&ph));
}
return 0;
}
void initializedStack(stack *p){
p->top = 0;
}
void push(stack *p, int val){
p->top++;
p->items[p->top] = val;
}
int pop(stack *p){
int y;
y = p->items[p->top];
p->items[p->top] = 0;
(p->top)--;
return y;
}
我目前处于程序的测试阶段,它只包括加法操作。为了测试这个程序,我为 if 语句的加法部分打印了语句,并在最后弹出。运行它会给我以下输出:
50
49
99
当输出应该是:
1
2
3
看起来加法操作有效,但我不知道 50 和 49 来自哪里?编写代码以提供准确输出的正确方法是什么?谢谢!
解决方案
当你这样做时:
push(&ph, argv[1][i]);
您正在推送给定数字的ASCII值,而不是其解码后的数值 [atoi
如果它可以对单个字符进行操作,后者相当于返回的值]。
这可能不是您,因为稍后您 push a + b
,它们是数字/二进制值。
虽然这仅适用于单个数字,但快速解决方法是:
push(&ph, argv[1][i] - '0');
否则,通常,您需要组装整个数字字符串并使用 (eg) 对其进行解码atoi
。
在这种情况下,您需要为某些东西处理一些空格12 23 +
这是一个清理版本,它使用strtok
并atoi
允许更通用的数字。[请原谅无偿的风格清理]:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int top;
int items[100];
} stack;
void
initializedStack(stack *p)
{
p->top = 0;
}
void
push(stack *p, int val)
{
p->top++;
p->items[p->top] = val;
}
int
pop(stack *p)
{
int y;
y = p->items[p->top];
p->items[p->top] = 0;
(p->top)--;
return y;
}
int
main(int argc, char **argv)
{
stack ph;
int i,
a,
b;
int val = 0;
char *buf;
char *token;
int chr;
if (argc != 2) {
printf("Usage: %s argument\n", argv[0]);
exit(1);
}
buf = argv[1];
initializedStack(&ph);
while (1) {
token = strtok(buf," ");
if (token == NULL)
break;
buf = NULL;
chr = token[0];
if (strcmp(token,"+") == 0) {
a = pop(&ph);
printf("%d\n", a);
b = pop(&ph);
printf("%d\n", b);
val = a + b;
push(&ph, val);
continue;
}
if ((chr >= '0') && (chr <= '9')) {
val = atoi(token);
push(&ph, val);
continue;
}
}
printf("%d\n", pop(&ph));
return 0;
}
推荐阅读
- c# - 如何连接 .DrawEllipse 和 .DrawString
- excel - 如何找到列的第 n 个非空白行?
- c# - TypeError:无法读取 Object.eval 角度 6 处未定义的属性“已选择”
- elasticsearch - ElasticSearch - 设置摄取集群以将文档推送到两个单独的数据集群?
- java - 从 Drawable Resource Id 解码位图给出 null
- c# - 附加属性在样式中始终具有默认值
- c++ - 在 C++ 中,关闭类成员函数内的静态文件流
- javascript - 为什么 setState 不会触发重新渲染?
- google-api - 地理编码返回 ZERO_RESULTS
- c# - 通过 Visual Studio 2017+ 中的代码获取工作项的变更集