2016-12-05 86 views
3

我對編程世界相當陌生,所以請原諒我,如果這是一個常見的錯誤。sscanf()double&string

我試圖從一個輸入字符串中掃描3個double值和3個字符串,但它不會在第二個值後繼續。

double total_weight_kg(char *s, int Length) { 
    double weights[3]; 
    char units[3]; 
    int test = sscanf(s, "%lf, %s, %lf, %s, %lf, %s", 
         &weights[0], &units[0], 
         &weights[1], &units[1], 
         &weights[2], &units[2]); 
    printf("%i\n", test); 
    printf("%s\n", &units[0]); 

int main(void) { 
    total_weight_kg("5, g, 1, t, 175, kg", 3); 
    return 0; 

第一個打印輸出2和第二個g。

此外我想比較單位[我]在一個循環,但似乎無法得到那個工作。

for (int i = 0; i < Length; i++) { 
    w = weights[i]; 
    if (strcmp(units[i], "kg") == 0) { 
     weight += w; 
    } 
} 

我希望你能幫助我找到這個問題的解決方案,

編輯:Everyting正在工作,現在打算。非常感謝您的幫助。 (19 [^,]是一個大問題)

+3

的'scanf'格式' 「%S」'是用於讀取空終止字符串。你的數組'units'是一個由三個單獨的'char'元素組成的數組,而不是字符串。編譯器應該一直對你發出警告(對於這個和對'strcmp'調用)。 –

+1

'char units [3];'不會持有g和kg。你在這裏有緩衝區溢出。例如,你必須創建一個char []數組,例如'char units [3] [10]'。 –

+2

我們原諒你:C字符串是地獄。 –

回答

2

有在你的代碼中的一些問題:

  • 要掃描的字符串轉換爲units,你必須將其定義爲char一個二維數組:

    char units[3][20]; 
    
  • 您應該修改scanf格式,以停止,和空格的單詞解析,如user3386109所示。

  • 還修改printf傳遞數組而不是其地址。

這裏是修改後的代碼:

double total_weight_kg(char *s, int Length) { 
    double weights[3]; 
    char units[3][20]; 
    int test = sscanf(s, "%lf, %19[^, \n], %lf, %19[^, \n], %lf, %19[^, \n]", 
         &weights[0], units[0], 
         &weights[1], units[1], 
         &weights[2], units[2]); 
    printf("%i\n", test); 
    printf("%s\n", units[0]); 
    ... 
} 

int main(void) { 
    total_weight_kg("5, g, 1, t, 175, kg", 3); 
    return 0; 
} 
+0

我將它改爲char單位[3] [20];但如果我編譯代碼,它只是告訴我「%s期望類型爲'char *'的參數,但參數4的類型爲'char(*)[20]」我需要做些什麼來改變它? – mejasper

+0

@mejasper:發佈整個函數的代碼以及最小可編譯示例所需的代碼。 – chqrlie

+0

@mejasper:同時從'units [0]'參數中刪除多餘'&'到'scanf()'。 – chqrlie