2014-02-18 63 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

相關問題