OP 没有指定如何处理像“9.00”这样的输入。我假设 OP 希望看到打印“9.00”而不是“9”,因为输入给出了十分之一和百分之一的位置。
需要先将数字作为字符串读取,以便稍后评估其精度。数字及其精度需要单独的变量。建议使用@bgamlath 中的结构。
使用sscanf() 或atof() 解析字符串。
解析'.'位置的字符串。
int VikasRead(float *value, int *precision) {
char buf[100];
*precision = 0;
if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
int end;
int retval = sscanf(buf, "%f%n", value, &end);
char * dp = strchr(buf, '.');
if (dp != NULL && retval == 1) {
*precision = &buf[end] - dp;
}
return retval;
}
int VikasWrite(float value, int precision) {
int retval;
if (precision > 1) {
// Note: printf("%.*f\n", 0, value) is UB.
retval = printf("%.*f\n", precision - 1, value); // 1.234
}
else if (precision == 0) {;
retval = printf("%.0f\n", value); // 123
}
else {
retval = printf("%#.0f\n", value); // 123.
}
return retval;
}
void VikasTest(void) {
float value;
int precision;
while (VikasRead(&value, &precision) == 1) {
VikasWrite(value, precision);
}
}
像1.23e56 这样的指数输入会使过程复杂化,但方法仍然相同。需要另外查找'e' 或'E'。
某些语言环境使用',' 作为小数点,这使事情变得更加复杂。