【问题标题】:C Sprintf() appends junk charactersC Sprintf() 附加垃圾字符
【发布时间】:2011-10-26 07:20:55
【问题描述】:

我尝试使用 sprintf 附加一个 int、string 和一个 int。

sprintf(str,"%d:%s:%d",count-1,temp_str,start_id);

这里,start_id 的值总是一样的。 char * 的 temp_str 的值每次都会增加。我得到了一段时间的正确输出,然后我的 sprintf 开始在 temp_str 和 startid 之间打印垃圾字符。所以我的 str 被损坏了。

谁能解释这种行为?

例子

计数 11

11:1:2:3:1:2:3:1:2:3:1:21:3:1:2:3:1:2:3:1:2:3:1:2 :3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3 :1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1 :2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2

计数 8

8:1:2:3:1:2:3:1:2:3:1:21:3:1:2:3:1:2:3:1:2:3:1:2 :3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3 :1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1 :2:3:1:2:3:1:2:3:1:2:3:1:2:3:1:2:3:1�:2

我不明白为什么以及如何将“�”附加到字符串

【问题讨论】:

  • 发布所有变量的定义和一些代码。可能str不够高。
  • 在您使用 sprintf 的情况下,至少 99% 的情况下您实际上应该使用 snprintf。

标签: c printf


【解决方案1】:

temp_str 在某些时候没有以空值终止,或者您已经破坏了str 的缓冲区,并且其他一些内存访问正在影响它。

没有看到代码,有点难以判断,但是,如果你将str 的大小加倍并且问题行为发生了变化,那么很可能是后者。

【讨论】:

    【解决方案2】:

    1> 在使用 sprintf 之前,尝试 将你的 str 缓冲区设置为 0

    2> temp_str 是一个 char * 的值每次都会增加 你这是什么意思?

    这应该是一个普通的字符指针,它将指向一些字符串,该字符串应该以空结尾并且 tha 将被复制到 str

    3> 三个参数组合后的总大小不应超过 str 缓冲区的大小

    【讨论】:

      【解决方案3】:

      看起来字符串 temp_str 不是以 NUL 结尾的。您可以在调用sprintf 之前终止它,或者如果您知道要打印的长度,请使用%.*s 格式化运算符,如下所示:

      int str_len = ...;     // Calculate length of temp_str
      sprintf(str, "%d:%.*s:%d", count-1, str_len, temp_str, start_id);
      

      【讨论】:

      • 只要确保你没有用strlen计算temp_str的长度:-)
      【解决方案4】:

      您正在运行 temp_str 的末尾。检查您的界限并确保它以空值终止。停止增加太阳,直到结束。

      【讨论】:

        猜你喜欢
        • 2019-09-25
        • 2016-03-03
        • 2021-11-05
        • 1970-01-01
        • 2011-02-10
        • 2015-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多