2015-10-06 132 views
2

是否可以使用sscanf在下面的示例中讀取字符串s作爲兩個10個字符(包括空格)的寬浮點數?或者我必須將10個字符的塊複製到臨時字符數組,並在該臨時數組上使用sscanf用sscanf從char字符串中讀取一個固定寬度的浮點數

#include <stdio.h> 
int main(int argc, const char* argv[]) 
{ 
    char s[]={"  6.4887.0522e+06"}; 
    float f1, f2; 

    sscanf(s, "%10f%10f", &f1, &f2); 
    printf("%10f %10f\n", f1, f2); 
} 

我在這個例子中的願望是從sscanf讀得f1 = 6.448f2 = 7052200.

+1

如果我們假設這僅僅是一個例子,並且您希望有一個解析這些數據的通用算法,那麼答案就取決於數據格式中的常量。 (例如,點總是4的長度後的數字組?)。一般來說,你可以用字段寬度來停止在一個數字中間,但是@ user3121023表示,空格不計算在內。 –

+0

謝謝,但我顯然不夠清楚。字符數組應該總是被解析爲長度爲10個字符的組。所以我的例子中的第一個子字符串是「6.488」,第二個字符串是「7.0522e + 06」。問題不在於只讀取這個特定的字符串。我正在尋找一種通用的方法來讀取這種類型的數據,其中每個10字符的子字符串可以包含以有效浮點格式格式化的任何種類的浮點值。 – Anders

+0

你可以拆分數組:https://ideone.com/CGgtUj – mch

回答

1

掃描集可能工作。將有效字符放在括號中。 10將掃描限制爲10個字符。 %n說明符將報告掃描處理的字符數。這可以在sscanf中用於遍歷一個長字符串。

char substr[11] = {'\0'}; 
char s[]={"  6.4887.0522e+06"}; 
int offset = 0; 
int used = 0; 

while ((sscanf (s + offset, "%10[-+.eE 0-9]%n", substr, &used)) == 1) { 
    if (used == 10) { 
     printf ("%s\n", substr); 
     //convert as needed 
     offset += used; 
    } 
    else { 
     //do something to handle the problem 
     break;//one option... 
    } 
} 
+0

這是sscanf格式的一些非常漂亮的用法。我接受這個答案,並感謝你花在我的問題上的時間。謝謝! – Anders

2

如果s[]const,暫時使s[10] = 0

void foo(char *s) { 
    while (*s) { 
    size_t length = strlen(s); 
    char temp = 0; 
    if (length > 10) { 
     length = 10; 
     temp = s[10]; 
     s[10] = 0; 
    } 
    float f1; 
    if (sscanf(s, "%f", &f1) == 1) printf("%f\n", f1); 
    s += length; 
    s[0] = temp; 
    } 
} 
+0

這也是一個很好的答案。我有點驚訝,但沒有選擇讓sscanf在最大字段寬度參數中包含前導空格。我看不出如何丟棄前導空白比不丟棄它們更有用。如果包含這些空白區域,則讀取固定字段寬度的數據格式將是一行代碼。 – Anders

+0

@Anders'scanf()'是爲空白量無關的數據設計的。 IAC,簡單地將10 char'複製到緩衝區中,附加一個空字符然後解析似乎很簡單。 – chux