关于课后作业 自己编写一个类似atio函数程序的问题
#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;
}
这个是原题里面的答案
这个答案是不是有缺陷的 大佬们
如果我输入一个 0 是显示出并未找到任何数值
0 不也是数值么 #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);
printf("结果是:%lld\n", num);
}
*/
printf("结果是:%lld\n", num);
}
return 0;
}
本帖最后由 jackz007 于 2021-11-24 23:37 编辑
#include <stdio.h>
long long atoix(char s[])
{
long long c , e , i , k , r ;
for(i = 0 ; s && s != '-' && (s < '0' || s > '9') ; i ++) ;
k = (s == '-') ? -1 : 1 ;
if(k == -1) i ++ ;
for(c = r = 0 ; s ; i ++) {
if(s >= '0' && s <= '9') {
if(! c) e = k * (s - '0') ;
else e = r * 10 + k * (s - '0') ;
if((k > 0 && e > r) || (k < 0 && e < r)) {
r = e ;
c ++ ;
} else {
r = -1 ;// 溢出
break ;
}
} else if(c) break ;
}
return r ;
}
int main(void)
{
char s ;
gets(s) ;
printf("%I64d\n" , atoix(s)) ;
}
编译、运行实况:
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
9223372036854775807 <--- long long 正向最大值
9223372036854775807
D:\00.Excise\C>x
9223372036854775808 <--- 超出 long long 正向最大值
-1
D:\00.Excise\C>x
-9223372036854775808 <--- long long 负向最大值
-9223372036854775808
D:\00.Excise\C>x
-9223372036854775809 <--- 超出 long long 负向最大值
-1
D:\00.Excise\C>
页:
[1]