【问题标题】:Extra characters added to end of string in c在c中添加到字符串末尾的额外字符
【发布时间】:2014-12-08 18:39:34
【问题描述】:

所以我试图在 C 中打印出一个字符串,当我打印出它时,我总是在字符串的末尾得到额外的字符。 代码:

char binaryNumber[16] = "1111000011110000";
printf("binary integer: %s\n", binaryNumber);

输出:

二进制整数:1111000011110000▒▒▒▒

你能帮我弄清楚为什么会这样吗?我认为这是我的代码中其他一些问题的根源。我之前以更复杂的方式创建字符串时遇到了这个问题,并且在这种情况下也得到了额外的字符,但它们是不同的。所以我用最基本的方法制作了一个字符串(这里显示的方法)并且仍然遇到问题

【问题讨论】:

  • 请记住,C 中的字符串有一个额外的字符,即终止符'\0'。没有那个终结符会导致undefined behavior

标签: c string printf


【解决方案1】:

让编译器确定需要的元素数量

char binaryNumber[] = "1111000011110000";
// same as
// char binaryNumber[17] = "1111000011110000";

【讨论】:

  • 谢谢!这行得通,我一直都知道我需要一个空字符,但总是不确定我是否需要大小为 16 或 17,我现在知道并且我知道我可以更好地理解 c 知道我可以按照你说的做(这很好,因为我有两天内对此进行测试)。此修复还修复了我在此处未提及的其他问题,非常感谢。
【解决方案2】:

应该是

char binaryNumber[17] = "1111000011110000";

这是因为 C 中的字符串是空终止的。因此,如果您不为将添加的隐式 \0 提供额外的字符空间,您将阅读垃圾

【讨论】:

  • 你的字符串字面量有 18 个元素:最后两个相等(两个 \0s)
  • 字符串文字已经有一个空终止符(参见链接)。因此,您必须删除您的\0 并保留[17],或者添加一个字节来存储两个空终止符。 c0x.coding-guidelines.com/6.4.5.html
  • 在这种情况下 \0 算一两个字符吗?
  • @bs7280 1 个字符,因为它是一个转义序列。
【解决方案3】:

您的数组中有 16 个字符。并且没有地方可以容纳\0 字符。

%s 打印一个字符串,直到遇到\0

所以你看到的是一些垃圾字符被打印出来。请让你的字符串是\0终止

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多