【问题标题】:Question about terminating strings in C关于C中字符串终止的问题
【发布时间】:2014-05-03 20:14:20
【问题描述】:

我见过两种终止字符串的方法。

// char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\n'}; //ignore this one, /n does not terminate

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}

char greeting[6] = {'H', 'e', 'l', 'l', 'o', 0};

出于好奇,哪个更标准?


我的另一个问题是下面的代码

char greeting[] = {'H', 'e', 'l', 'l', 'o'};
printf("Greeting message: %s\n", greeting );
//output message is Greeting message: Hello? Question mark is upside down in Xcode

这里发生了什么?我希望编译器能够检测字符串本身的大小并在最后一个字符之后添加一个终止字符。然后在那个 printf 语句中,它会在 'o' 之后停止。为什么有一个?那里?还有它怎么知道在“?”之后停止。 ?它是否有可能继续运行并拆分随机字符,直到它崩溃或奇迹般地在内存中找到一个随机的空终止字符?

【问题讨论】:

  • '\n' 不终止字符串。
  • 抱歉,感谢您接听。问题已被编辑。
  • 0'\0' 意思完全一样;它们都是int 类型的常量,值为0。使用更清晰的那个——如果要存储为char,则应该是'\0'。或者只使用像"hello" 这样的字符串文字,它隐式以零结尾,甚至更清晰。

标签: c string null


【解决方案1】:

如果你把 \0 放在一个字符串中,这是一种告诉编译器这是特别的东西的一种方式。具体来说,它告诉编译器它是一个空值。这些也通常藏在弦内。

要回答您的问题,我认为这两者都不是更标准的。更标准的方法是:

char greeting[] = "Hello";

或更笼统地说:

const char *greeting = "Hello";

这段代码:

char greeting[] = {'H', 'e', 'l', 'l', 'o'};
printf("Greeting message: %s\n", greeting );

打印出一个奇怪的字符,因为字符串没有显式终止。

【讨论】:

  • 我明白了。谢谢。看起来我没有正确阅读某篇文章。 C 编译器不会在您执行 " char greeting[] = { '..... '}; 时添加一个空终止 \0;但是当您执行 greeting[] = "hello" 时它会添加。执行 greeting[]=" hello" 实际上输出正确,没有任何问号。
  • 奇怪的输出来自内存中 'o' 之后的任何内容:printf 将继续打印找到的所有字节,直到看到 0。因此结果可能非常不可预测。
【解决方案2】:

“哪个更标准?”

这两种方法都有“更多”或“更少”的标准。 0'\0' 都代表 C 中 int 类型的常量零,这意味着两者绝对等价并且可以互换使用。

“我希望编译器检测字符串的大小并添加终止字符”

编译器没有“字符串”这样的概念,并且知道任何“字符串”的注意事项。 C 中的“字符串”是一个纯粹的运行时概念——一个以零字符结尾的字符数组。唯一的例外是 字符串文字,编译器对它们的处理方式不同(例如,隐式添加了零终止符)。您在示例中所拥有的只是抽象的 char 数组。它们不是编译器的“字符串”。编译器不会将这些数组视为“字符串”,也不会向其中添加任何内容。它只做你告诉它做的事情。你明确要求它创建一个char 数组,最后没有任何零。这个char 数组不是字符串,不能用作字符串。如果您尝试将其用作字符串,则行为将是未定义的,这完全是您的错。

【讨论】:

    【解决方案3】:

    另一个答案的附录。两者的区别非常微妙。 '\0' 是一个为零的字符常量(一个字节)。'0' 是一个为零的整数常量(通常是四个字节)。当您将一个整数常量分配给一个字符时,它会被隐式转换。因此,在您的第二个示例中, 0 在分配给数组之前被隐式转换为 '\0'。

    效果是一样的,所以没关系,但是你可以说 '\0' 稍微好一点,因为它没有任何隐式转换。

    但正如另一个答案所说,'char greeting[] = "Hello"' 比任何一个都好。

    使用显式字符数组的唯一原因是,如果您想对字符数据做一些非字符串类的事情,可能是这样的:

    char greeting[12] = {'H', 'e', 'l', 'l', 'o', '\0', 'w', 'o', 'r', 'l', 'd', '\0'}
    

    当然,你不会使用标准的 C 函数来处理这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多