簡體   English   中英

為什么 sscanf %n 格式說明符對返回值沒有影響?

[英]Why does the sscanf %n format specifier have no effect on the return value?

無論%n說明符是否存在,下面 sscanf 函數的返回值都是 1。 然而變量n 中的值發生了變化(在這種情況下從 0 到 5),那么為什么函數不返回 2?

#include <stdio.h>

int main() {
    int d = 0, n = 0;
    char *p = "10   foo bar";
    printf("%d\n", sscanf(p, " %d %n", &d, &n ) );
    printf("%d %d\n", d, n);
    return 0;
}

在我看來,這是設計使然,而不是這里的代碼問題。 這是因為%n不會失敗,因為它只是計算讀取的字符數,所以以這種方式檢查它是多余的嗎? 謝謝,我很想了解更多這里發生的事情。

sscanf(p, " %d %n", &d, &n )

%n (next) 是到目前為止從輸入緩沖區讀取的字節數。 它是一個輸出參數,用於指示在 sscanf 函數返回之前已讀取輸入緩沖區的距離。 sscanf 返回值不同,它表示“成功匹配的輸入項數”。

您可以將%n (和int n next 參數)視為次要輸出(或返回)值。

https://linux.die.net/man/3/sscanf

到目前為止從輸入消耗的字符數通過下一個指針存儲。


您的案例的一些示例以查看%n (下一個指針)的效果:

int d = 0, n = 0;
// char *p = "100   foo bar";  // 100, 6    // read upto 6 chars, parse 100
// char *p = "100foo bar";     // 100, 3    // read upto 3 chars, parse 100
// char *p = "foo100 bar";     // 0, 0      // read 0 chars, fails to parse any int
char *p = "10   foo bar";      // 10, 5     // read 5 chars, parse 10

printf("%d\n", sscanf(p, " %d %n", &d, &n ) );

printf("%s\n", (p + n));       // "foo bar"

來自 C99(第 7.19.6.2 節):

%n指令的執行不會增加fscanf函數執行完成時返回的賦值計數。

暫無
暫無

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

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