簡體   English   中英

使用printf我使用的函數的輸出返回錯誤的值

[英]Using printf the output of a function I use returns the wrong value

我有以下代碼:

#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%

為什么用printf調用函數K2G時會得到重復的值? 這是給我錯誤結果的行:

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

這是正常現象,您返回一個指向g的指針,該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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM