2013-04-07 37 views
1

定義:插入空字符到的snprintf

  • CHAR_BACKSLASH被定義爲 '\\' 或0x5C

變量:

  • 工作目錄是C字符​​串
  • myFilePath是C字符​​串

    int len = strlen(workingDir); 
    char lastChar = workingDir[len - 1]; 
    

下面,myFilePath會從工作目錄 + 反斜槓形成 +字面「myfile.txt的」

在三元參數,如果沒有反斜槓,我試圖放一個反斜槓。

snprintf(myFilePath, 
      sizeof(myFilePath), 
      "%s%s%s", 
      workingDir, 
      (lastChar == CHAR_BACKSLASH) ? "" : "\\", 
      "myfile.txt"); 

如果可能的話,我想將它更改爲這樣的事情,但不知道怎麼樣,因爲它需要一個空的單引號字符,我不知道這是不允許的。

snprintf(myFilePath, 
      sizeof(myFilePath), 
      "%s%c%s", 
      workingDir, 
      (lastChar == CHAR_BACKSLASH) ? '' : CHAR_BACKSLASH, 
      "myfile.txt"); 
+0

第一種情況對於意圖是什麼更清楚。最後一種情況不太清楚,很可能snprintf在處理字符時只比字符串長一點稍快。優化不值得缺乏可讀性。 – 2013-04-07 21:15:16

+0

如果爲了清晰起見而將其改爲使用'\\',而不是所有情況下的十六進制代碼,該怎麼辦? – Lakey 2013-04-07 21:16:27

+0

你有一個好點。爲了清晰起見,我將其改爲使用define(CHAR_BACKSLASH),而不是用於反斜槓的十六進制代碼 – Lakey 2013-04-07 21:21:54

回答

2

爲什麼不能這樣?那麼你不必擔心'%'是否是%c的有效案例。 snprintf有一個更少的varg來處理。

snprintf(myFilePath, 
     sizeof(myFilePath), 
     (lastChar == '\\') ? "%s%s" : "%s\\%s" 
     workingDir, 
     "myfile.txt"); 
+0

我喜歡此解決方案。我沒有想到在格式字符串本身上做三元運算符。聰明! – Lakey 2013-04-07 21:26:04