2015-11-05 45 views
0

我有這樣的代碼:用printf我用返回錯誤值的函數的輸出

#include<stdio.h> 
#include<stdlib.h> 

char *K2G(int k) 
{ 
    static char g[10]; 
    if (k > 1048576) { 
     sprintf(g, "%.2fGB", (float) k/1048576); 
    } else { 
     if (k > 1024) { 
      sprintf(g, "%.2fMB", (float) k/1024); 
     } else { 
      sprintf(g, "%dKB", k); 
     } 
    } 
    printf("%s\n", g); 
    return g; 
} 

main() 
{ 
    FILE *fp; 
    int imt = 0, imf = 0, imu = 0; 
    char cmt[40], cmf[40], cmti[20], cmfi[20], a[20], b[20]; 
    while (1) { 
     system("clear"); 
     fp = fopen("/proc/meminfo", "r"); 
     fgets(cmt, 40, fp); 
     fgets(cmf, 40, fp); 
     fclose(fp); 
     printf("%s%s\n", cmf, cmt); 
     sscanf(cmt, "%s%d%s", a, &imt, b); 
     sscanf(cmf, "%s%d%s", a, &imf, b); 
     imu = imt - imf; 
     printf("%s/%s=%d%\n", K2G(imu), K2G(imt), imu * 100/imt); 
     sleep(1); 
    } 
} 

我得到的輸出是一樣的東西:

MemFree:   494256 kB 
MemTotal:  10258000 kB 

9.78GB 
9.31GB 
9.31GB/9.31GB=95% 

最後一行始終顯示相同等號前的兩個值。輸出應該是:

MemFree:   494724 kB 
MemTotal:  10258000 kB 

9.31GB 
9.78GB 
9.31GB/9.78GB=95% 

爲什麼我得到重複值當我打電話功能K2G的printf?這是給我的不正確的結果行:

printf("%s/%s=%d%\n", K2G(imu), K2G(imt), imu * 100/imt); 
+1

請向我們展示代碼,輸入值以及實際和期望的輸出值。編輯您的問題以包含該信息。沒有這些信息就無法幫助你。 –

+1

請在問題中顯示您的代碼,而不是在圖片中! –

+1

請不要發佈文字圖片,特別是那些圖片的鏈接。首先,從圖像中複製粘貼文本是不可能的,其次,所有鏈接都會變得陳舊,從而使問題變得無用。 –

回答

2

這種現象是正常的,你返回一個指針g這是一個靜態緩衝區,並在每次調用這個緩衝區將被覆蓋。

所以,如果你做printf(..., K2G(x), K2G(Y),...),printf參數「看到」將與它的最新內容都是相同的g緩衝區。

你可以這樣做:

char simu[20]; 
char simt[20]; 
strcpy(simu, K2G(imu)); 
strcpy(simt, K2G(imt)); 
printf(..., simu, simt,...); 

編輯:

或者您可以使用另一種圖案,其中必須提供一個緩衝區K2G:

char *K2G(int k, char *g) 
{ 
    if (k > 1048576) { 
     sprintf(g, "%.2fGB", (float) k/1048576); 
    } else { 
     if (k > 1024) { 
      sprintf(g, "%.2fMB", (float) k/1024); 
     } else { 
      sprintf(g, "%dKB", k); 
     } 
    } 
    printf("%s\n", g); 
    return g; 
} 

... 

char simu[20]; 
char simt[20]; 
K2G(imu, simu); 
K2G(imt, simt); 
printf(..., simu, simt,...); 

這更透明並避免使用strcpy

+0

上帝喜歡!!!!!! – sonichy

+1

使用'strncopy(.. K2G(...),10)'而不是... –

+1

@umläute:'strncpy'(假定)對建議的簡單'strcpy'有什麼可能的優勢? – usr2564301