znuxc 发表于 2021-10-20 22:30:59

s1e13

#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> 头文件。

jackz007 发表于 2021-10-20 23:25:33

本帖最后由 jackz007 于 2021-10-21 03:39 编辑

#include <stdio.h>

bool notoverflow(int d , char c)
{
      bool r = true                                                      ;
      int max = 0x7fffffff , min = 0x80000000                              ;
      if((d > 0 && d * 10 + c < d) || (d < 0 && d * 10 - c > d)) r = false ;
      return r                                                             ;
}

int main(void)
{
      char c                                                               ;
      int d , k                                                            ;
      bool f                                                               ;
      for(d = k = 0 , f = true ; (c = getchar()) != '\n' && f ;) {
                if(c >= '0' && c <= '9') {
                        if(notoverflow(d , c - '0')) {
                              d = d * 10 + c - '0'                         ;
                              k ++                                       ;
                        } else {
                              f = false                                    ;
                        }                        
                } else {
                        if(k) break                                          ;
                }      
      }
      if(k) {
                if(f) printf("%d\n" , d)                                     ;
                else printf("数值溢出 !\n")                                  ;
      } else {
                printf("没有输入任何数字.\n")                              ;
      }      
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

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

D:\00.Excise\C>x
12345678
12345678

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

D:\00.Excise\C>x
123456778
123456778

D:\00.Excise\C>x
2147483647
2147483647

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

D:\00.Excise\C>
页: [1]
查看完整版本: s1e13