作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在scanf()
函数中我想只取十进制值。我们可以实现吗?例如,为了显示最多两位小数,我们使用 printf("%.2f",A)
我们如何为 scanf()
函数做到这一点。
最佳答案
scanf()
没有一个简单的方法来满足 OP 的目标。
推荐使用fgets()
进行输入,然后解析字符串。
char buf[20];
fgets(buf, sizeof buf, stdin); // Could add check for NULL here
为了限制在 2 位小数,代码可以读取部分数字:整数部分和分数,然后形成结果:
long long ipart;
unsigned d[2];
int n;
if (sscanf(buf, "%lld.%1u%1u %n", &ipart, &d[0], &d[1], &n) != 3 || buf[n]) {
Handle_InvalidInput();
}
double value = (d[0]*10 + d[1])/100.0;
value = ipart + ipart < 0 ? -value : value;
尽管这实现了 OP 的任务,但我认为它并没有解决 OP 的更大目标。因此,与其限制输入,不如读取输入然后限定它:
double value;
if (sscanf(buf, "%lf %n", &value, &n) != 1 || buf[n]) {
Handle_InvalidInput();
}
double rounded_value = round(value * 100.0)/100.0;
if (rounded_value != value) {
Handle_OverlyPreciseNumber(value, rounded_value);
}
其他更迂腐的方法会检查字符串 buf
是否有 ddd...ddd.dd 语法等。但问题很明确:读取数据然后限定读取的数据。不要试图限制输入。
关于c - 如何在 scanf 中只接受一定的精度(这么多小数位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132748/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!