为什么我的代码里多一个少一个printf结果完全不同
刚学C,The C Programming Language中文版里面讲命令行参数的时候有个题叫人做一个程序计算从命令行输入的逆波兰式(后缀式)的值 我做的代码在下面:
因为一遍遍的F7成程序在cmd下测试很麻烦,就自己先在程序里面把输入设好再调试
有两个问题:一是下面红字标的那个printf,其实这个里面有很多printf,方便我找哪儿错了慢慢改动,最后一行一行都删了,剩下这一个,
不删他程序输出正常,得出结果18,删了直接没结果,显示 Native' has exited with code -1 (0xffffffff).这难道不只是一个显示某些值的输出函数么
,对程序怎么会造成影响的?
还有个问题是暂不管问题一,把下面那一串赋值删掉,cmd里面命令行方式输入(加过一个for循环检验,cmd输入的值确实和现在赋值的是一样的),但是函数算出来结果是16.
会不会是我自己整的stack.h有问题?stack.h也贴出来,求高人指点(网上找了好几个C语言版的stack.h都不能用,自己照数据结构书上抄代码,然后改了一些才能运行的)
我用的是VC2008+WindowsXP,代码后缀是.c不是.cpp
对了,还有个事,下面标绿的goto那一行是迫不得已的,第一个while(i<argc),就算i=12,argc=12,他照样继续进循环,怎么改都不得行,只有整了一个goto。也不知道是为啥
(我试过都为12时i<argc值是0,while继续,但是直接写while(0),就能停)
自己更新,把这儿当日志用:
继续测试,发现-1是stack.h里面红字那句的错误代码,也就是说删掉printf后入栈时存储空间分配失败(书上这么写的,那句负责空间分配失败),这两兄弟之间是神马关系?
在更新,发现那句语句的那个位置,把printf语句换成putchar,getchar,也能起到同样的作用,scanf不行,别的乱七八糟的语句也不行。
总结一下就是,(没有printf的情况下)程序运行到那个位置,S->base的值由一个正确的位置(3753176),变成了(0),(除了initstack之外,程序里没找到任何对S->base进行赋值的语句)所以接下去程序就乱七八糟的开始运行了,最后出错前一步S->base直接变成负值了,然后就出错了;
如果那个位置加一条语句(printf,getchar,putchar皆可),S->base的值就不会莫名其妙的变成0,一直是3753176,所以程序就得出了正确的结果。
why?
程序代码:
#include <stdio.h> #include <stdlib.h> #include <stack.h> main(int argc,char *argv[]) { int i=1; int j,k,p; double *f=(double *)malloc(sizeof(double)); //f和g用于存储当前需要计算的两个数字 double *g=(double *)malloc(sizeof(double)); SqStack *S; argv[1]="4"; argv[2]="2"; argv[3]="/"; argv[4]="3"; argv[5]="3"; argv[6]="*"; argv[7]="1"; argv[8]="-"; argv[9]="2"; argv[10]="*"; argv[11]="+"; argv[11]="+"; argc=12; InitStack(S); while(i<argc) { while(((int)**(argv+i)<=57)&&((int)**(argv+i)>=48)) //48~57是0~9的ASCII码,是数字则入栈 { Push(S,(double)(atoi(*(argv+i)))); i++; } while((i<argc)&&((int)**(argv+i)<=48)) //不是数字就是符号,计算 { Pop(S,g); //退出两数字用于计算 Pop(S,f); printf("3.i=%d\n",i); //就是这个printf switch((int)**(argv+i)) //将加减乘除运算符号转为ASCII码进行比较 { case 42: *g=*f*(*g); break; case 47: *g=*f/(*g); break; case 43: *g=*f+(*g); break; case 45: *g=*f-(*g); break; } i++; Push(S,*g); getchar(); } } Pop(S,g); printf("The answer is:%f",*g); getchar(); getchar(); }
stack.h
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define Status void
#define SElemType double
#define OVERFLOW -1
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack();
Status Push();
Status pop();
int IsEmpty();
Status InitStack(SqStack *S){
S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S->base)
exit(OVERFLOW);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
//return OK;
};
Status Push(SqStack *S,SElemType e){
if(S->top-S->base>=S->stacksize)
{
S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base) exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*(S->top)=e;
S->top++;
//return OK;
}
Status Pop(SqStack *S,SElemType *e){
if(S->top==S->base) printf("error"); //return ERROR;
*e=*(--S->top);
//return OK;
};
GetTop(SqStack *S,SElemType *e)
{
*e=*(S->top-1);
}
int IsEmpty(SqStack *S)
{
if(S->top==S->base)
return 1;
else return 0;
}
[ 本帖最后由 yellowcat 于 2011-1-26 15:34 编辑 ]