林江楠 发表于 2021-10-18 20:03:53

小甲鱼课后作业c语言sle14

#include <stdio.h>
#include <math.h>

int main()
{
      int ch;
      long long num = 0;
      long long temp; // 临时变量,用于测试是否超出范围
      int is_overflow = 0;

      const int max_int = pow(2, sizeof(int) * 8) / 2 - 1;
      const int min_int = pow(2, sizeof(int) * 8) / 2 * (-1);

      printf("请输入待转换的字符串:");

      do
      {
                ch = getchar();

                if (ch >= '0' && ch <= '9')
                {
                        temp = 10 * num + (ch - '0');
                        if (temp > max_int || temp < min_int)
                        {
                              is_overflow = 1;
                              break;
                        }
                        else
                        {
                              num = temp;
                        }
                }
                else
                {
                        if (num)
                        {
                              break; // 如果已有数字,则退出循环
                        }
                }

      }
      while (ch != '\n');

      if (is_overflow)
      {
                printf("数值超出范围,结果未定义!\n");
      }
      else
      {
                if (!num)
                {
                        printf("并未找到任何数值!\n");
                }
                else
                {
                        printf("结果是:%d\n", num);
                }
      }

      return 0;
}


这里为什莫不在最后直接判断数值是否超出范围,然后紧跟着直接打印数值超出范围,结果未定义
而是多用了一个变量

jackz007 发表于 2021-10-18 21:26:14

本帖最后由 jackz007 于 2021-10-18 21:27 编辑

#include <stdio.h>

bool notoverflow(long long d , char c)
{
      long long max = 0x7fffffffffffffff , min = 0x8000000000000000         ;
      bool r = true                                                         ;
      if(d && ((d > 0 && max / d < c) || (d < 0 && min / d < c))) r = false ;
      return r                                                            ;
}

int main(void)
{
      char ch                                                               ;
      long long d                                                         ;
      bool f                                                                ;
      for(d = 0 , f = true ; (ch = getchar()) != '\n' && ch >= '0' && ch <= '9' && f ;) {
                if(notoverflow(d , ch - '0')) {
                        d = d * 10 + ch - '0'                                 ;
                } else {
                        fprintf(stderr , "数值溢出!\n")                      ;
                        f = false                                             ;
                }
      }
      if(f) printf("您键入的数值是:%I64d\n" , d)                           ;
}
      编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
123456789012345678
您键入的数值是:123456789012345678

D:\00.Excise\C>x
12345678901234567890123456
数值溢出!

D:\00.Excise\C>

林江楠 发表于 2021-10-20 21:18:44

jackz007 发表于 2021-10-18 21:26
编译、运行实况:

大哥,你的代码有点乱啊{:5_104:}

jackz007 发表于 2021-10-20 21:39:13

林江楠 发表于 2021-10-20 21:18
大哥,你的代码有点乱啊

      这个代码你都嫌乱?你给来个不乱的让大家看看。
页: [1]
查看完整版本: 小甲鱼课后作业c语言sle14