【问题标题】:String format replace by value in character in snprintf字符串格式用 snprintf 中字符中的值替换
【发布时间】:2017-03-27 11:25:39
【问题描述】:

我的基于 ESP8266 的 NodeMCU 中有以下功能代码:

  snprintf ( temp, 800,
             "<html>\
  <head>\
    <meta http-equiv='refresh' content='25'/>\
    <title>NodeMCU DHT11 Sensor \and Relay Board</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
      li { margin: 10px 0;}\
    </style>\
  </head>\
  <body>\
  <h1>Hello from NodeMCU!</h1>\
  <p>Temperature: %02d &#8451;<br>\
  Humidity: %2d %<br></p><ol>\
  <li><a href='/control?relay=5&state=%d'>Turn Relay 1 On\/Off</a>\
  <li><a href='/control?relay=4&state=%d'>Turn Relay 2 On\/Off</a></ol>\
    <p> Uptime: %02d:%02d:%02d </p>\
  </body>\
</html>",
             t, h, !digitalRead(5), !digitalRead(4), hr, min % 60, sec % 60
           );

我希望能够根据来自digitalRead(5) 的 pin 状态将文本替换为关闭,反之亦然。所以我不必编写打开/关闭继电器 1,而是应该使用 digitalRead(pinNum) 获取状态并根据状态设置文本打开或关闭。

【问题讨论】:

  • 简单的事情可能是使用三元运算符将正确的字符串作为参数传递给 snprintf:digitalRead(5) ? "on" : "off"
  • 我会使用什么格式? %c!

标签: c++ c printf nodemcu


【解决方案1】:

ternary (conditional) operator 是您的朋友。您可以将其视为内联 if 语句。语法是这样的

condition ? val1 : val2

表达式将根据condition 生成结果。如果condition 为真,它将产生val1,否则将产生val2

您可以在sprintfs 参数列表中使用它来根据引脚状态返回一个字符串。

snprintf(temp, 800, 
    "... <li><a href='/control?relay=5&state=%d'>Turn Relay 1 %s</a><li> ... ", 
    !digitalRead(5), (digitalRead(5) ? "Off" : "On");

%s 是字符串的占位符,根据引脚 5 的状态,它将替换为 "On""Off"

【讨论】:

  • 很难想象有一个库提供snprintf,但不支持格式字符串中的%s...也许您的程序中的其他地方有错误
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2015-01-21
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多