簡體   English   中英

帶有“_”分隔符的sscanf

[英]sscanf with “_” delimiter in C

我在C中運行以下代碼。我沒有得到正確的答案。

int main()
{

    char test[100] = "This_Is_A_Test_99";
    char tmp1[10],tmp2[10],tmp3[10],tmp4[10],tmp5[10];

    sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5);

    printf ("Temp 1 is %s\n",tmp1);
    printf ("Temp 2 is %s\n",tmp2);
    printf ("Temp 3 is %s\n",tmp3);
    printf ("Temp 4 is %s\n",tmp4);
    printf ("Temp 5 is %s\n",tmp5);

    return 0;
}

我得到的輸出是

Temp 1 is This
Temp 2 is 
Temp 3 is 
Temp 4 is 
Temp 5 is 

我要做的是在個別變量上取“This”“Is”“A”“Test”和“99”。

sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5);

應該

sscanf(test,"%[^_]_%[^_]_%[^_]_%[^_]_%s",tmp1,tmp2,tmp3,tmp4,tmp5);

請注意,您與分離的占位符,而不是_

請參見http://ideone.com/8zBmG

此外,您不需要' ,除非你想跳過單引號,以及秒。

(順便說一下,你應該看看strtok_r 。)

您正在掃描字符串之間的逗號,文本中沒有。 從模式中刪除它們:

sscanf(test,"%[^'_']%[^'_']%[^'_']%[^'_']%s",tmp1,tmp2,tmp3,tmp4,tmp5);

撇號也許是不必要的。 你不需要引用任何東西,因為沒有shell會擴展它:

sscanf(test,"%[^_]%[^_]%[^_]%[^_]%s",tmp1,tmp2,tmp3,tmp4,tmp5);

根據pmg的建議,你應該將你的臨時長度明確地寫入scanf參數,以確保你沒有得到緩沖區溢出:

sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5);

然后檢查返回值:

int token_count = sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5);
if ( token_count != 5 ) { fprintf(stderr, "Something went wrong\n"); exit(42); }

它看起來像你在你的sscanf字符串中包含了逗號(,)。

但是你的輸入中沒有逗號。 沒有任何逗號可以處理, sscanf在第一個字符串"This"之后失敗

我建議嘗試格式字符串:

"%[^_]_%[^_]_%[^_]_%[^_]_%s"

暫無
暫無

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

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