我试图将结果输出到用户输入的十进制精度。换句话说,如果输入145,则输出到0 d.p。如果输入145.67,则输出到2 d.p。
我试图通过尝试不同的事情与%.lf
实现这一点,但到目前为止还没有设法做到这一点。在C语言中有办法做到这一点吗?如果有的话,能给它起个名字吗?这样我就可以了解更多了。
#include <math.h>
#include <stdio.h>
int main() {
// Using long, double or something else?
double number, fourthRoot;
printf("Enter a number: ");
scanf("%lf", &number);
fourthRoot = sqrt(sqrt(number));
printf("4th root of number %lf is %.10lf", number, fourthRoot);
return 0;
}
用fgets()
或类似scanf("%s",...
的代码读取用户输入的行
char buf[400];
if (fgets(buf, sizeof buf, stdin)) {
然后处理字符串。一种方法是用sscanf()
int n;
// Get the number and offset to end of scan
if (sscanf(buf, "%lf%n", &number, &n) == 1) {
// Look for '.'
char *dp = strchr(buf, '.');
if (dp && dp < buf + n) {
// decimal point found
int pre = buf + n - dp - 1;
printf("%.*fn", pre, number);
这个可以工作,但如果使用指数符号确实会被愚弄。其他代码可以查找E
或e
(或P
,p
与十六进制FP符号)。
有很多你应该担心的边缘情况,但这应该让你开始:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
compute_root(const char *s)
{
char *end;
double number = strtod(s, &end);
if( *end ){
fprintf(stderr, "Invalid input: %sn", s);
return 1;
}
char *dp = strchr(s, '.');
int precision = dp ? end - dp - 1: 0;
char fmt[256];
snprintf(fmt, sizeof fmt, "4th root of %%s is %%.%dlfn", precision);
printf(fmt, s, pow(number, .25));
return 0;
}
int
main(int argc, char **argv)
{
int errors = 0;
char buf[64];
if( argc > 1 ){
while( *++argv ){
errors += compute_root(*argv);
}
} else while( scanf("%63s", buf) == 1 ){
errors += compute_root(buf);
}
return errors ? EXIT_FAILURE : EXIT_SUCCESS;
}
作为练习,考虑像5.345e4
这样的输入。上面的代码输出精度为5,但您可能想要3。处理这些情况是不平凡的(对于"平凡"的某些定义)。