鱼C论坛

 找回密码
 立即注册
查看: 264|回复: 1

[已解决]编译无错误但是无法正常运行

[复制链接]
发表于 2023-11-23 19:33:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>

#define stack_init_size 100
#define stackincrement 20
#define MaxBuffer 10

typedef double elemtype;

typedef struct
{
        elemtype* top;
        elemtype* base;
        int stacksize;
}sqStack;

void InitStack(sqStack* s)
{
        s->base = (elemtype*)malloc(stack_init_size * sizeof(elemtype));
        if (!s->base)
        {
                exit(0);
        }
        s->base = s->top;
        s->stacksize = stack_init_size;
}

void Push(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)
                {
                        printf("failed to realloc stack");
                        exit(1);
                }
        }
        *(s->top) = e;
        s->top++;
}

void Pop(sqStack* s, elemtype* e)
{
        if (s->top == s->base)
        {
                printf("栈已经为空");
                exit(1);
        }
        *e = *--(s->top);
}

int Len(sqStack s)
{
        return (s.top - s.base);
}

int main()
{
        char c;
        sqStack s;

        InitStack(&s);

        double d, e;
        char str[MaxBuffer];
        int i = 0;

        printf("输入反波兰算式,输入#停止: ");
        scanf_s("%c", &c);

        while (c != '#')
        {
                while (isdigit(c) || c == '.')
                {
                        str[i++] = c;
                        str[i] = '\0';
                        if (i >= 10) return -1;
                        scanf_s("%c", &c);
                        if (c == ' ')
                        {
                                d = atof(str);
                                Push(&s, d);
                                i = 0;
                                break;
                        }
                }
                switch (c)
                {
                case '+':
                        Pop(&s, &d);
                        Pop(&s, &e);
                        Push(&s, d + e);
                        break;
                case '-':
                        Pop(&s, &d);
                        Pop(&s, &e);
                        Push(&s, e - d);
                        break;
                case '*':
                        Pop(&s, &d);
                        Pop(&s, &e);
                        Push(&s, d * e);
                        break;
                case '/':
                        Pop(&s, &d);
                        Pop(&s, &e);
                        if (d != 0) Push(&s, e / d);
                        else
                        {
                                printf("除数不能为0");
                                exit(0);
                        }
                        break;
                }
                scanf_s("%c", &c);
        }
        Pop(&s, &d);
        printf("\n结果为:%f ", d);
        return 0;
}
在编译时无报错,但是执行到输入数据后无法正常得出结果
最佳答案
2023-11-23 19:35:29
在你的代码中,有几个问题导致程序无法正常运行。

首先,你没有包含头文件`<stdio.h>`和`<stdlib.h>`,这会导致一些函数的定义不被识别。添加以下两行代码到开头:
  1. #include <stdio.h>
  2. #include <stdlib.h>
复制代码

其次,你在初始化栈的时候,将`s->base`指针赋值给`s->top`,这是错误的。正确的初始化栈的方法应该是:
  1. s->top = s->base;
复制代码

再次,你在读取数字字符序列的时候,用变量`str`来保存字符序列,并将其赋值为`\0`,这是错误的。正确的保存字符序列的方法应该是:
  1. str[i++] = c;
复制代码
同时,在将字符序列转换为浮点数时,应该使用`atof`函数,并将其传递整个字符序列作为参数。修改相应的代码如下:
  1. // 声明一个字符数组,用于保存字符序列
  2. char str[MaxBuffer];
  3. int i = 0;
  4. printf("输入反波兰算式,输入#停止: ");
  5. scanf_s("%c", &c);
  6. while (c != '#')
  7. {
  8.     while (isdigit(c) || c == '.')
  9.     {
  10.         str[i++] = c;
  11.         if (i >= MaxBuffer) return -1;
  12.         scanf_s("%c", &c);
  13.         if (c == ' ')
  14.         {
  15.             str[i] = '\0';  // 在字符序列最后添加'\0'作为结束标志
  16.             d = atof(str); // 使用atof将字符序列转换为浮点数
  17.             Push(&s, d);
  18.             i = 0;
  19.             break;
  20.         }
  21.     }
  22.     // ...
复制代码

最后,你在打印结果时使用了`%f`作为格式化字符串,但是变量`d`的类型是`double`,应该使用`%lf`作为格式化字符串。修改相应代码如下:
  1. Pop(&s, &d);
  2. printf("\n结果为:%lf ", d);
复制代码

综上所述,修复了以上问题的完整代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define stack_init_size 100
  4. #define stackincrement 20
  5. #define MaxBuffer 10
  6. typedef double elemtype;
  7. typedef struct
  8. {
  9.     elemtype* top;
  10.     elemtype* base;
  11.     int stacksize;
  12. } sqStack;
  13. void InitStack(sqStack* s)
  14. {
  15.     s->base = (elemtype*)malloc(stack_init_size * sizeof(elemtype));
  16.     if (!s->base)
  17.     {
  18.         exit(0);
  19.     }
  20.     s->top = s->base; // 将s->base赋值给s->top
  21.     s->stacksize = stack_init_size;
  22. }
  23. void Push(sqStack* s, elemtype e)
  24. {
  25.     if (s->top - s->base >= s->stacksize)
  26.     {
  27.         s->base = (elemtype*)realloc(s->base, (s->stacksize + stackincrement) * sizeof(elemtype));
  28.         if (!s->base)
  29.         {
  30.             printf("failed to realloc stack");
  31.             exit(1);
  32.         }
  33.     }
  34.     *(s->top) = e;
  35.     s->top++;
  36. }
  37. void Pop(sqStack* s, elemtype* e)
  38. {
  39.     if (s->top == s->base)
  40.     {
  41.         printf("栈已经为空");
  42.         exit(1);
  43.     }
  44.     *e = *--(s->top);
  45. }
  46. int Len(sqStack s)
  47. {
  48.     return (s.top - s.base);
  49. }
  50. int main()
  51. {
  52.     char c;
  53.     sqStack s;
  54.     InitStack(&s);
  55.     double d, e;
  56.     char str[MaxBuffer]; // 修改为字符数组
  57.     int i = 0;
  58.     printf("输入反波兰算式,输入#停止: ");
  59.     scanf_s("%c", &c);
  60.     while (c != '#')
  61.     {
  62.         while (isdigit(c) || c == '.')
  63.         {
  64.             str[i++] = c;
  65.             if (i >= MaxBuffer) return -1;
  66.             scanf_s("%c", &c);
  67.             if (c == ' ')
  68.             {
  69.                 str[i] = '\0';
  70.                 d = atof(str);
  71.                 Push(&s, d);
  72.                 i = 0;
  73.                 break;
  74.             }
  75.         }
  76.         switch (c)
  77.         {
  78.         case '+':
  79.             Pop(&s, &d);
  80.             Pop(&s, &e);
  81.             Push(&s, d + e);
  82.             break;
  83.         case '-':
  84.             Pop(&s, &d);
  85.             Pop(&s, &e);
  86.             Push(&s,e - d);
  87.             break;
  88.         case '*':
  89.             Pop(&s, &d);
  90.             Pop(&s, &e);
  91.             Push(&s, d * e);
  92.             break;
  93.         case '/':
  94.             Pop(&s, &d);
  95.             Pop(&s, &e);
  96.             if (d != 0) Push(&s, e / d);
  97.             else
  98.             {
  99.                 printf("除数不能为0");
  100.                 exit(0);
  101.             }
  102.             break;
  103.         }
  104.         scanf_s("%c", &c);
  105.     }
  106.     Pop(&s, &d);
  107.     printf("\n结果为:%lf ", d); // 修改为%lf
  108.     return 0;
  109. }
复制代码

希望这样修改后的代码能够解决你的问题。如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-23 19:35:29 | 显示全部楼层    本楼为最佳答案   
在你的代码中,有几个问题导致程序无法正常运行。

首先,你没有包含头文件`<stdio.h>`和`<stdlib.h>`,这会导致一些函数的定义不被识别。添加以下两行代码到开头:
  1. #include <stdio.h>
  2. #include <stdlib.h>
复制代码

其次,你在初始化栈的时候,将`s->base`指针赋值给`s->top`,这是错误的。正确的初始化栈的方法应该是:
  1. s->top = s->base;
复制代码

再次,你在读取数字字符序列的时候,用变量`str`来保存字符序列,并将其赋值为`\0`,这是错误的。正确的保存字符序列的方法应该是:
  1. str[i++] = c;
复制代码
同时,在将字符序列转换为浮点数时,应该使用`atof`函数,并将其传递整个字符序列作为参数。修改相应的代码如下:
  1. // 声明一个字符数组,用于保存字符序列
  2. char str[MaxBuffer];
  3. int i = 0;
  4. printf("输入反波兰算式,输入#停止: ");
  5. scanf_s("%c", &c);
  6. while (c != '#')
  7. {
  8.     while (isdigit(c) || c == '.')
  9.     {
  10.         str[i++] = c;
  11.         if (i >= MaxBuffer) return -1;
  12.         scanf_s("%c", &c);
  13.         if (c == ' ')
  14.         {
  15.             str[i] = '\0';  // 在字符序列最后添加'\0'作为结束标志
  16.             d = atof(str); // 使用atof将字符序列转换为浮点数
  17.             Push(&s, d);
  18.             i = 0;
  19.             break;
  20.         }
  21.     }
  22.     // ...
复制代码

最后,你在打印结果时使用了`%f`作为格式化字符串,但是变量`d`的类型是`double`,应该使用`%lf`作为格式化字符串。修改相应代码如下:
  1. Pop(&s, &d);
  2. printf("\n结果为:%lf ", d);
复制代码

综上所述,修复了以上问题的完整代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define stack_init_size 100
  4. #define stackincrement 20
  5. #define MaxBuffer 10
  6. typedef double elemtype;
  7. typedef struct
  8. {
  9.     elemtype* top;
  10.     elemtype* base;
  11.     int stacksize;
  12. } sqStack;
  13. void InitStack(sqStack* s)
  14. {
  15.     s->base = (elemtype*)malloc(stack_init_size * sizeof(elemtype));
  16.     if (!s->base)
  17.     {
  18.         exit(0);
  19.     }
  20.     s->top = s->base; // 将s->base赋值给s->top
  21.     s->stacksize = stack_init_size;
  22. }
  23. void Push(sqStack* s, elemtype e)
  24. {
  25.     if (s->top - s->base >= s->stacksize)
  26.     {
  27.         s->base = (elemtype*)realloc(s->base, (s->stacksize + stackincrement) * sizeof(elemtype));
  28.         if (!s->base)
  29.         {
  30.             printf("failed to realloc stack");
  31.             exit(1);
  32.         }
  33.     }
  34.     *(s->top) = e;
  35.     s->top++;
  36. }
  37. void Pop(sqStack* s, elemtype* e)
  38. {
  39.     if (s->top == s->base)
  40.     {
  41.         printf("栈已经为空");
  42.         exit(1);
  43.     }
  44.     *e = *--(s->top);
  45. }
  46. int Len(sqStack s)
  47. {
  48.     return (s.top - s.base);
  49. }
  50. int main()
  51. {
  52.     char c;
  53.     sqStack s;
  54.     InitStack(&s);
  55.     double d, e;
  56.     char str[MaxBuffer]; // 修改为字符数组
  57.     int i = 0;
  58.     printf("输入反波兰算式,输入#停止: ");
  59.     scanf_s("%c", &c);
  60.     while (c != '#')
  61.     {
  62.         while (isdigit(c) || c == '.')
  63.         {
  64.             str[i++] = c;
  65.             if (i >= MaxBuffer) return -1;
  66.             scanf_s("%c", &c);
  67.             if (c == ' ')
  68.             {
  69.                 str[i] = '\0';
  70.                 d = atof(str);
  71.                 Push(&s, d);
  72.                 i = 0;
  73.                 break;
  74.             }
  75.         }
  76.         switch (c)
  77.         {
  78.         case '+':
  79.             Pop(&s, &d);
  80.             Pop(&s, &e);
  81.             Push(&s, d + e);
  82.             break;
  83.         case '-':
  84.             Pop(&s, &d);
  85.             Pop(&s, &e);
  86.             Push(&s,e - d);
  87.             break;
  88.         case '*':
  89.             Pop(&s, &d);
  90.             Pop(&s, &e);
  91.             Push(&s, d * e);
  92.             break;
  93.         case '/':
  94.             Pop(&s, &d);
  95.             Pop(&s, &e);
  96.             if (d != 0) Push(&s, e / d);
  97.             else
  98.             {
  99.                 printf("除数不能为0");
  100.                 exit(0);
  101.             }
  102.             break;
  103.         }
  104.         scanf_s("%c", &c);
  105.     }
  106.     Pop(&s, &d);
  107.     printf("\n结果为:%lf ", d); // 修改为%lf
  108.     return 0;
  109. }
复制代码

希望这样修改后的代码能够解决你的问题。如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-29 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表