2017-10-28 93 views
4

作爲程序的一部分,我將命令處理爲一系列令牌。到目前爲止,從來就得到了:scanf說明符「n」是什麼數字?

void exec_this(char* cmd) { 
    char token[100] = {0}; 
    sscanf(cmd, "%s", token) 
    if(0 == strcmp(token, "add")) { 
    char arg1[100] = {0}; 
    sscanf(cmd, "%*s%s", arg1);  
    // continue parsing more args... 
    } 
} 

的「%* S」是醜陋的,尤其是當有很多爭論。

看着http://www.cplusplus.com/reference/cstdio/scanf/有可能符「N」爲retrieveing「字讀爲止」。不確定在這種情況下「讀」是什麼意思,因爲字符串中有空格和東西,而不是檢索字符串的一部分; 「添加foo 42」。這是我想要的工作,但不知道這是否是正確的:

void exec_this(char* cmd) { 
    char token[100] = {0}; 
    int n; 
    sscanf(cmd, "%s%n", token, &n); 
    if(0 == strcmp(token, "add")) { 
    char arg1[100] = {0}; 
    sscanf(&cmd[n], "%s%n", arg1, &n); 
    // continue parsing more args... 
    } 
} 
+0

你需要從'sscanf'檢查返回值,這樣你就知道了'N'值是否有效。它不算作轉換,因此請確保在'%n'之前有一個分配轉換規範(或者只有一個空白空間) - 所以你不能有一個不可檢測的匹配失敗。 –

+0

@JonathanLeffler是的你是對的。我故意忽略錯誤處理,以保持示例簡單。 – Andreas

回答

2

字符數讀到目前爲止是包括所有的空格的:

int a, b, c; 
sscanf("  quick brown  fox jumps", "%*s%n%*s%n%*s%n", &a, &b, &c); 
printf("%d %d %d\n", a, b, c); 

上面prints10 17 27,讓你在掃描的每個點獲得所述緩衝器內的位置。

這非常適合您的使用情況,因爲您可以跳過第一個sscanf進入第二個sscanf時處理的字符數。您可以使用&cmd[n]或同等cmd+n跳過初始n字符。

+0

@Andreas並不是真的,他們忘記說'n'不會被計入參數列表中的填充項。從某種意義上說,這是一種元信息,因爲它描述了輸入,而不是直接來自輸入。 – dasblinkenlight

+0

alinsoar的回答很明確(「n」不會增加分配計數)。刪除了原來的評論 – Andreas

1

的ISO 9899在說7.19.6.2p12

n ~~沒有輸入被消耗。對應的參數將是指向 符號整數成將被寫入從 輸入流到目前爲止由該調用fscanf函數讀取的字符的數目。一個 %N指令的執行不會增加在 完成fscanf函數的執行返回的任務數。沒有參數被轉換, 但一個被消耗。如果轉換SPECI音響陽離子包括勘定 抑制字符或音響場寬度,該行爲是定義理解過程網絡連接。

相關問題