user-0 提问: 二进制转换

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:/*利用栈的数据接构，将二进制转换成十进制*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>  #define STACKINCREMENT 10 #define MAXSTACK 60 #define MAX_SIZE 128  typedef char ElemType;  typedef struct{     ElemType *top;     ElemType *base;     int StackSize; }sqStack;  void initStack(sqStack *s) {     s->base = (ElemType *)malloc(MAXSTACK * sizeof(ElemType));     if (!s->base)         exit(0);     s->top = s->base;     s->StackSize = MAXSTACK;  }  void pushStack(sqStack *s, ElemType e) {     if (s->top - s->base >= s->StackSize) {         s->base = (ElemType *)realloc(s->base, (s->StackSize + STACKINCREMENT)*sizeof(ElemType));         if (!s->base)             exit(0);         printf("Realloc memery!\n");         s->top = s->StackSize + s->base;         s->StackSize = s->StackSize + STACKINCREMENT;     }      *(s->top) = e;     s->top++; }  void pullStack(sqStack *s, ElemType *e) {     if (s->base == s->top)     {         printf("stack is empty!\n");         return;     }     *e = *--(s->top); } void destroy(sqStack *s) {     free(s->base);     s->top = s->base = NULL;     s->StackSize = 0; }  int StackLen(sqStack s) {     return (s.top - s.base); }  int main() {     sqStack s;     ElemType buf[MAX_SIZE], e;     int i, len, sum = 0;     printf("请输入二进制数(#号键结束)：");     initStack(&s);      fgets(buf, MAX_SIZE, stdin);    /*buf include '\n' */     len = strlen(buf);      for (i = 0; i < len; i++) {         e = buf[i];         if (e != '\n')             pushStack(&s, e);     }     len = StackLen(s);     printf("len = %d\n", len);     for (i = 0; i < len; i++)     {         pullStack(&s, &e);         sum = sum + (e - 48)*pow(2, i);     }     printf("输入的十进制为：%d", sum);     destroy(&s);     getchar();      return 0; } 改了一下你的程序，发现问题主要出在入栈上，即入栈时没有正确入栈。直接原因是scanf, %c的问题，建议避开输入是接收缓存里的回车符。 我的方法是使用fgets,一次输入，分别入栈。 奥你用的是数组然后赋值给e再入栈，我再仔细看看scanf的定义去，谢谢啦

user: user-1
content: 我去这么复杂，我不敢看都~ 我就查了查用递归写

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 2 楼 小付同学哦的回复:我去这么复杂，我不敢看都~ 我就查了查用递归写  我是自学算法时候书上的代码，嘿嘿谢谢啦

user: user-0
content: 引用 1 楼 赵4老师的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 我试着改，都改了好几天了，还是不能运行下去，才想着求助的……我回去再调着看看吧，谢谢啦

user: user-3
content: /*利用栈的数据接构，将二进制转换成十进制*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>  #define STACKINCREMENT 10 #define MAXSTACK 60 #define MAX_SIZE 128  typedef char ElemType;  typedef struct{     ElemType *top;     ElemType *base;     int StackSize; }sqStack;  void initStack(sqStack *s) {     s->base = (ElemType *)malloc(MAXSTACK * sizeof(ElemType));     if (!s->base)         exit(0);     s->top = s->base;     s->StackSize = MAXSTACK;  }  void pushStack(sqStack *s, ElemType e) {     if (s->top - s->base >= s->StackSize) {         s->base = (ElemType *)realloc(s->base, (s->StackSize + STACKINCREMENT)*sizeof(ElemType));         if (!s->base)             exit(0);         printf("Realloc memery!\n");         s->top = s->StackSize + s->base;         s->StackSize = s->StackSize + STACKINCREMENT;     }      *(s->top) = e;     s->top++; }  void pullStack(sqStack *s, ElemType *e) {     if (s->base == s->top)     {         printf("stack is empty!\n");         return;     }     *e = *--(s->top); } void destroy(sqStack *s) {     free(s->base);     s->top = s->base = NULL;     s->StackSize = 0; }  int StackLen(sqStack s) {     return (s.top - s.base); }  int main() {     sqStack s;     ElemType buf[MAX_SIZE], e;     int i, len, sum = 0;     printf("请输入二进制数(#号键结束)：");     initStack(&s);      fgets(buf, MAX_SIZE, stdin);    /*buf include '\n' */     len = strlen(buf);      for (i = 0; i < len; i++) {         e = buf[i];         if (e != '\n')             pushStack(&s, e);     }     len = StackLen(s);     printf("len = %d\n", len);     for (i = 0; i < len; i++)     {         pullStack(&s, &e);         sum = sum + (e - 48)*pow(2, i);     }     printf("输入的十进制为：%d", sum);     destroy(&s);     getchar();      return 0; } 改了一下你的程序，发现问题主要出在入栈上，即入栈时没有正确入栈。直接原因是scanf, %c的问题，建议避开输入是接收缓存里的回车符。 我的方法是使用fgets,一次输入，分别入栈。