【问题标题】:Arduino serial.print() is adding an extra character after the actual charArduino serial.print() 在实际字符之后添加了一个额外的字符
【发布时间】:2010-12-24 22:50:47
【问题描述】:
        char *feedtime = "0:0";
        String interval = "6";

    char* convert(char* x, String y){

             int hour;
             int minute;


             sscanf(x, "%d:%d", &hour, &minute);

             char buf[5];

             if (y == "6"){

                 if (hour > 17){

                     hour = (hour+6)%24;

                     snprintf(buf, 5, "%d%s", hour, ":0");

                 }

                 if (hour < 18){

                   hour = hour + 6;
                   snprintf(buf, 5, "%d%s", hour, ":0\0");

                 }

             }

             buf [5] = '\0';
             return buf;
}

当我执行转换时(时间,间隔);

串行监视器返回正确的值,但会添加一个 ' 或其他符号。

有什么想法吗?

我根据人们所说的更新了我的代码,但我仍然遇到同样的问题?

【问题讨论】:

  • 您没有解决 jcopenha 答案中的问题。如果您向我们展示调用 convert() 并使用结果的代码,这将有助于我们更具建设性。
  • 你需要一些常量——摆脱幻数。具体来说,如果您将缓冲区声明为 5 个字节,这意味着您可以寻址 0-4。 buf[5] = '\0' 正在写入不属于你的内存。

标签: c string buffer arduino printf


【解决方案1】:

您正在返回一个指向堆栈变量的指针。这是错误的。一旦函数退出,'buf' 使用的堆栈空间是未定义的。

【讨论】:

    【解决方案2】:

    您的缓冲区中需要一个额外的字符。您只有一个 4 个字符的数组,但需要 5 个字符(2 个用于小时,2 个用于 :0,1 个用于尾随 0)。完成后,您还需要空终止字符串。

    以及 jcopenha 所说的。

    【讨论】:

    • 我将缓冲区大小增加到 5,以空终止字符串我将如何处理,我想空终止缓冲区?
    • buf 大小不会根据小时数而变化,例如如果小时只有一位数,那么 buf 是否只需要大小 4 一个用于 our,两个用于 :0,一个用于空?
    • 只需将 buf 声明为 5 个字符并将您的 snprintf 参数更改为 5。如果有空间,snprintf 将自动放入空终止符。
    【解决方案3】:

    您的字符串没有正确地以零结尾。增加buf的大小。

    【讨论】:

    • buf [5] = '\0';那个 null 会终止我的字符串吗?
    • 是的,如果你为它腾出空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多