鱼C论坛

 找回密码
 立即注册
查看: 2112|回复: 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 编辑
#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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-4 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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