小甲鱼课后作业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: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>
jackz007 发表于 2021-10-18 21:26
编译、运行实况:
大哥,你的代码有点乱啊{:5_104:} 林江楠 发表于 2021-10-20 21:18
大哥,你的代码有点乱啊
这个代码你都嫌乱?你给来个不乱的让大家看看。
页:
[1]