你的代码有几个问题需要修复:
1. 在 do-while 循环内部,你使用 getchar() 获取下一个字符。然而,你在循环条件中也使用了 getchar()。这会导致在判断循环条件之前多读取了一个字符,可能会导致跳过部分数字。
2. 在打印结果时,你使用了 %d 格式字符串来打印 num,但是 num 是一个 long long 类型的变量,应该使用 %lld 格式字符串。
3. 你的代码尚未实现只打印第一组数字的要求。你需要在找到第一个数字后,终止循环以避免继续读取后续数字。
4. 在计算整型变量范围时,你使用了 pow(2, sizeof(int)* 8) / 2 - 1 和 pow(2, sizeof(int)* 8) / 2 * (-1),但是这种方法可能会引入浮点数误差。可以使用移位运算和按位取反来计算最大值和最小值。
基于以上问题,我给你提供一个修改后的代码:#include <stdio.h>int main(){ char ch; long long num = 0; // 最终结果 long long temp; // 判断是否超出范围 int is_overflow = 0; // 记录是否超出范围 const int max_int = (1 << (sizeof(int) * 8 - 1)) - 1; // int的最大值 const int min_int = -(1 << (sizeof(int) * 8 - 1)); // int 的最小值 printf("请输入待转换的字符串:"); do { ch = getchar(); if (ch >= '0' && ch <= '9') { temp = num * 10 + (ch - '0'); if (temp > max_int || temp < min_int) { is_overflow = 1; break; } else { num = temp; } } else if (num != 0) { break; // 只打印第一组数字 } } while (ch != '\n'); if (is_overflow == 1) { printf("数值超出范围,结果未定义!\n"); } else if (num != 0) { printf("结果是 %lld\n", num); } else { printf("并未找到任何数值!\n"); } return 0;}
这个修改后的代码考虑了你提到的问题,并进行了如下改动:
1. 修改了循环条件,将 getchar() 移至循环体内部,以避免多读取一个字符。
2. 使用 %lld 格式字符串来打印 long long 类型的变量。
3. 添加了终止循环的条件,使得在找到第一个数字后就可以终止循环。
4. 使用移位运算和按位取反来计算整型变量的最大值和最小值,避免了浮点数误差。
希望这些修改能够修复你的问题。如果还有其他疑问,请随时提问。 |