鱼C论坛

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

[已解决]s1e13

[复制链接]
发表于 2021-10-20 22:30:59 | 显示全部楼层 |阅读模式

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

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

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

int main()
{
        int ch;
        int num = 0;
       
        printf("请输入待转换的字符串:");
       
        while((ch = getchar()) != '\n')
        {
                if(ch <= '9' && ch >= '0' && num <= pow(2,15) - 1 && num >= pow(-2, 15) - 1)
                {
                        num = num * 10 + (ch - '0');
                        printf("结果是%d", num);
                }
                else if(num >= pow(2,15) - 1 && num <= pow(-2,15) - 1)
                {
                        printf("数据超出范围,结果未定义!\n");
                }
                else if(ch <= 48 && ch >= 57)
                {
                        printf("并未找到任何数值!\n");
                }
                if(num)
                {
                        break;
                 }
        }

请问一下我打的这些有问题吗?为什么达不到题目要求
A. 如果字符串中不存在任何表示数值的字符,则打印“并未找到任何数值”

B. 检测数值是否超出整型变量(int)可存放的范围,如果超出范围,则打印“数值超出范围,结果未定义!”的提醒。

C. 为了达到锻炼的效果,整型变量的范围需要自己计算,不使用 <limits.h> 头文件。
最佳答案
2021-10-20 23:25:33
本帖最后由 jackz007 于 2021-10-21 03:39 编辑
  1. #include <stdio.h>

  2. bool notoverflow(int d , char c)
  3. {
  4.         bool r = true                                                        ;
  5.         int max = 0x7fffffff , min = 0x80000000                              ;
  6.         if((d > 0 && d * 10 + c < d) || (d < 0 && d * 10 - c > d)) r = false ;
  7.         return r                                                             ;
  8. }

  9. int main(void)
  10. {
  11.         char c                                                               ;
  12.         int d , k                                                            ;
  13.         bool f                                                               ;
  14.         for(d = k = 0 , f = true ; (c = getchar()) != '\n' && f ;) {
  15.                 if(c >= '0' && c <= '9') {
  16.                         if(notoverflow(d , c - '0')) {
  17.                                 d = d * 10 + c - '0'                         ;
  18.                                 k ++                                         ;
  19.                         } else {
  20.                                 f = false                                    ;
  21.                         }                        
  22.                 } else {
  23.                         if(k) break                                          ;
  24.                 }        
  25.         }
  26.         if(k) {
  27.                 if(f) printf("%d\n" , d)                                     ;
  28.                 else printf("数值溢出 !\n")                                  ;
  29.         } else {
  30.                 printf("没有输入任何数字.\n")                                ;
  31.         }        
  32. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. ABCD
  4. 没有输入任何数字.

  5. D:\00.Excise\C>x
  6. 12345678
  7. 12345678

  8. D:\00.Excise\C>x
  9. ABCDE12345678901234567890
  10. 数值溢出 !

  11. D:\00.Excise\C>x
  12. 123456778
  13. 123456778

  14. D:\00.Excise\C>x
  15. 2147483647
  16. 2147483647

  17. D:\00.Excise\C>x
  18. 2147483648
  19. 数值溢出 !

  20. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-20 23:25:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-10-21 03:39 编辑
  1. #include <stdio.h>

  2. bool notoverflow(int d , char c)
  3. {
  4.         bool r = true                                                        ;
  5.         int max = 0x7fffffff , min = 0x80000000                              ;
  6.         if((d > 0 && d * 10 + c < d) || (d < 0 && d * 10 - c > d)) r = false ;
  7.         return r                                                             ;
  8. }

  9. int main(void)
  10. {
  11.         char c                                                               ;
  12.         int d , k                                                            ;
  13.         bool f                                                               ;
  14.         for(d = k = 0 , f = true ; (c = getchar()) != '\n' && f ;) {
  15.                 if(c >= '0' && c <= '9') {
  16.                         if(notoverflow(d , c - '0')) {
  17.                                 d = d * 10 + c - '0'                         ;
  18.                                 k ++                                         ;
  19.                         } else {
  20.                                 f = false                                    ;
  21.                         }                        
  22.                 } else {
  23.                         if(k) break                                          ;
  24.                 }        
  25.         }
  26.         if(k) {
  27.                 if(f) printf("%d\n" , d)                                     ;
  28.                 else printf("数值溢出 !\n")                                  ;
  29.         } else {
  30.                 printf("没有输入任何数字.\n")                                ;
  31.         }        
  32. }
复制代码

        编译、运行实况
  1. D:\00.Excise\C>g++ -o x x.c

  2. D:\00.Excise\C>x
  3. ABCD
  4. 没有输入任何数字.

  5. D:\00.Excise\C>x
  6. 12345678
  7. 12345678

  8. D:\00.Excise\C>x
  9. ABCDE12345678901234567890
  10. 数值溢出 !

  11. D:\00.Excise\C>x
  12. 123456778
  13. 123456778

  14. D:\00.Excise\C>x
  15. 2147483647
  16. 2147483647

  17. D:\00.Excise\C>x
  18. 2147483648
  19. 数值溢出 !

  20. D:\00.Excise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-14 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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