【问题标题】:C: String erroneously printing twiceC:字符串错误打印两次
【发布时间】:2021-05-25 23:44:20
【问题描述】:

我正在使用 C 字符串,如下面的程序:

#include <stdio.h>

int main(void){
    
    char *player1  = "Harry";
    char player2[] = "Rosie";
    char player3[6] = "Ronald";

    printf("%s %s %s\n", player1, player2, player3);
    return 0;
}

打印以下内容:

Harry Rosie RonaldRosie

为什么“Rosie”会打印两次?

【问题讨论】:

  • 因为 C 中的字符串总是以 nul 字节结尾,你的 player3 数组应该是 7 个字节而不是 6 个。
  • 您忘记在 Ronald 文字中为终止符留出空间,因此继续打印到以下变量,这里恰好是 Rosie
  • 必须是char player3[7] = "Ronald";才能持有终止的'\0'
  • 欢迎来到未定义行为的奇妙世界
  • player3 不包含字符串

标签: c string printf


【解决方案1】:

Ronald 有 6 个字母,因此 char player3[6] 没有为空终止符 '\0' 留下空格。

在您的情况下,它会打印内存中Ronald 之后的任何内容,直到遇到'\0'。那恰好是Rosie。在找到'\0' 之前,您可能并不总是那么幸运并遇到错误(例如内存保护)。

一种解决方案(除了您初始化HarryRosie 的方式之外)是将元素的数量增加一来为尾随'\0' 提供空间:

char player3[7] = "Ronald";

【讨论】:

  • 请注意,也可以简单地写成char players3[] = "Ronald",这会自动使数组的长度尽可能短,以保存字符串文字包括终止的空字符。跨度>
  • "因此,它将打印内存中 Ronald 之后的任何内容,直到找到 \0。"是众多可能性之一,因为将"%s" 与非字符串 一起使用是未定义的行为
  • 是的,不能保证运行无故障。我提到了 OP 的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多