2014-02-18 58 views
2

我使用<quadmath.h>。使用哪种参数类型可以正确读取我的输入? 如果我使用双样子:scanf的四分法和参数类型

printf("enter 3 values for s, t and mt:\n"); 
scanf("%lf %lf %lf", &s, &t, &mt); 
printf("%lf %lf %lf\n", s, t, mt); 

我尝试不同的可能性,而不是 “L”,例如:

scanf("%Qf %Qf %Qf", &s, &t, &mt); 

甚至没有

scanf("%f %f %f", &s, &t, &mt); 

但是我得到一个错误。

+1

您需要发布的内容错误,否则很难回答。 – user376507

+0

你收到哪个错误?不要在scanf中使用空格。 – Rahul

+0

@Rahul:scanf中的空间很好并且定义良好。他们的意思是输入要被读取直到空间。 –

回答

2

scanf(及相关功能和printf及相关功能)是不可扩展。它只能解析标准库知道的内容。 C标准库附带操作系统,而不是编译器。它不知道libquadmath,这是一个编译器扩展。

所以你必须阅读字符串,并使用strtoflt128分别转换它们。

请注意,C++流可以扩展为提取__float128,但我没有在quadmath库中看到C++接口。

+0

这意味着: printf(“为s,t和mt输入3个值:\ n”); 的scanf( “%C%C%C”,&S,T,&mt); 然后 S = __float128 strtoflt128( “S”,NULL);? 等 – maniA

+0

@ user3305448不'%C”,使用'%s',你应该将decalare的''''t','mt'作为字符数组,它足够容纳你输入的内容。 – jfly

+1

@ user3305448:几乎。String是'%s','%c ''只是单个字符,这还不够,而且应该包含长度限制,所以它更像'%63s'(如果你声明'char s [64]'并将's'作为参数)或者'%ms'(如果你声明'char * s',将'&s'作为参数传递并且随后调用'free(s)')。注意'%ms'是GNU扩展,但是quadmath不是可移植的。 –

2

您不能在scanf中使用%Qf说明符,您应该输入高精度数字作为字符串,然后使用strtoflt128进行转换。您也不能在printf中使用%Qf说明符,使用quadmath_snprintf__float128浮点数转换为字符串,然后使用printf%s说明符来显示它。这是一个例子。

#include <stdio.h> 
#include <quadmath.h> 
int main() 
{ 
     char s[256], t[256], mt[256]; 
     printf("enter 3 values for s, t and mt:\n"); 
     scanf("%s %s %s", s, t, mt); 
     __float128 qs = strtoflt128(s, NULL); 

     __float128 qt = strtoflt128(t, NULL); 

     __float128 qmt = strtoflt128(mt, NULL); 

     quadmath_snprintf(s, 256, "%Qf", qs); 

     quadmath_snprintf(t, 256, "%Qf", qt); 

     quadmath_snprintf(mt, 256, "%Qf", qmt); 

     printf("%s %s %s", s, t, mt); 
     return 0; 
} 

运行程序:

输入S,T和mt 3个值:
3.4 4.5 5.6(输入)
3.400000 4.500000 5.600000

相关问题