【问题标题】:Adding char string into sprintf将字符字符串添加到 sprintf
【发布时间】:2014-05-24 06:33:27
【问题描述】:

我正在为一些温度感应编写 PIC。最终输出通过 UART 发送到 PC。温度传感器 ID 的 MSB 用于确定传感器的位置。

我刚刚添加了我正在使用的代码的有罪部分(没有必要让你对其余部分感到厌烦)。问题在于我正在使用的 location[] char。我已经尝试了几种方法(*location, location[7]),但大多数都无法编译。下面的方法确实可以编译,但是在“Location=”之后的 %s 中没有显示任何内容。我也尝试了 %c,但仍然没有显示任何内容。

void convert_1820_send_temp(int *buff)
{
  // have removed other variables
  char location[];

  // Determine location based on sensor id
  if (dev_adr[7] == 181)
  {
    strcpy(location, "outside");
  }
  if (dev_adr[7] == 30)
  {
    strcpy(location, "ceiling");
  }
  if (dev_adr[7] == 46)
  {
    strcpy(location, "under  ");
  }
  if (dev_adr[7] == 18)
  {
    strcpy(location, "inside ");
  }
  else
  {
    strcpy(location, "unknown");
  }
  sprintf(s,
      "Temp=%c%d.%d degrees C, sensor=\"%d %d %d %d %d %d %d %d\",Location=%s\r\n",
      negSign, tempWhole, decimal, dev_adr[7], dev_adr[6], dev_adr[5],
      dev_adr[4], dev_adr[3], dev_adr[2], dev_adr[1], dev_adr[0]), location;

  USARTWriteString(s);
}

任何帮助将非常感谢。

【问题讨论】:

  • 不要使用strcpy,直接赋值给指针位置。使用 switch case 将使代码更具可读性。您是否打算将最后一个位置保留在 sprintf 之外?
  • 谢谢,忘了字符串长度+1规则:)
  • @alk char location[]; 是违反约束的。和char *location;不一样。
  • @MattMcNabb:你是对的,gcc 作为扩展定义了它是location [0].. 清理临时大脑圈...

标签: c char printf pic


【解决方案1】:

您需要在括号内移动,location

【讨论】:

  • 该死的错字......这当然没有帮助:),谢谢
【解决方案2】:

在您的示例中,您尝试将数据放入未分配空间的数组中。

改为使用以下内容。 (我还将if 语句重构为switch)。该位置是一个指向您想要的字符串的指针。这比使用strcpy 复制字符更安全、更高效。

char const *location;

switch (dev_addr[7]) {
case 181:
    location = "outside";
   break;
case 30:
    location = "ceiling";
   break;
default:
    location = "unknown";
    break;
}

【讨论】:

  • 感谢您的回复,我试了一下,因为我也喜欢这个开关。当我编译代码并收到以下错误(x4)时,它与 location = "xxxxxxx";:- temp_uart_16f877_ROM_read_working.c:397: 警告:(359)指针类型之间的非法转换指针指向 const unsigned char -> 指针为无符号字符
  • 说它仍然可以编译,将对其进行测试。试过了,%s 里面还是没有显示。
  • 好的,但是使用char const *location;
  • @Markus 如果第 397 行是 location = "xxxxxxxx"; 则编译器消息有些虚假,因为这些是 char 而不是 unsigned char (即使 plain char 是 unsigned ,它仍然不应该说);而且这种转换也不是非法的。你确定你使用的是 C 编译器吗?
  • 我正在使用 MPLAB X 和 MICROCHIP XC8 编译器,所以肯定是 c。
【解决方案3】:

你有什么不应该编译...试试这个:

void convert_1820_send_temp(int *buff)
{
    // have removed other variables
    char location[8]; // Minimum of 8 for 7 char strings below
    char s[512];

    // Determine location based on sensor id
    switch( dev_adr[7] ) {
    case 181:
        strcpy(location, "outside");
        break;
    case 30:
        strcpy(location, "ceiling");
        break;
    case 46:
        strcpy(location, "under  ");
        break
    case 18:
        strcpy(location, "inside ");
        break;
    default:
        strcpy(location, "unknown");
        break;
    }
    sprintf(s, "Temp=%c%d.%d degrees C, sensor=\"%d %d %d %d %d %d %d %d,Location=\"%s\"\r\n",
        negSign, tempWhole, decimal, dev_adr[7], dev_adr[6], dev_adr[5],
        dev_adr[4], dev_adr[3], dev_adr[2], dev_adr[1], dev_adr[0], location );

    USARTWriteString(s);   
}

【讨论】:

  • 对不起,我确实有 char s[64],只是将其作为剔除的一部分遗漏了。将尝试其余的,因为我仍然没有得到任何价值出现
  • 太棒了,所有排序,感谢所有,原因是我放置错误的括号和错误定义的字符的组合。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多