【问题标题】:Inserting empty character into snprintf将空字符插入 snprintf
【发布时间】:2013-04-07 21:07:24
【问题描述】:

定义:

  • CHAR_BACKSLASH 定义为 '\\' 或 0x5C

变量:

  • workingDir 是一个 C 字符串
  • myFilePath 是一个 C 字符串

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

在下面,myFilePathworkingDir + 反斜杠 + 文字 "myfile.txt" 组成/p>

在三元参数中,如果还没有反斜杠,我会尝试添加反斜杠。

    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");

【问题讨论】:

  • 第一种情况更清楚地说明意图是什么。最后一种情况不太清楚,而且很可能 snprintf 在处理字符方面只比长度为 1 的字符串稍微快一点。这种优化不值得缺乏可读性。
  • 如果为了清楚起见我将其更改为使用“\\”而不是所有情况下的十六进制代码会怎样?
  • 你说得很好。为了清楚起见,我将其更改为使用定义(CHAR_BACKSLASH),而不是反斜杠的十六进制代码

标签: c ternary-operator


【解决方案1】:

为什么不这样?那么你就不用担心 '' 是否是 %c 的有效案例。而且 snprintf 需要处理的 varg 也少了一个。

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

【讨论】:

  • 我喜欢这个解决方案。我没想过对格式字符串本身做三元运算符。聪明!
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2013-09-13
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多