【问题标题】:Why does strcpy work when array sizes are immutable, C为什么当数组大小不可变时 strcpy 工作,C
【发布时间】:2018-07-21 14:43:25
【问题描述】:

所以我在我的大学注册了一个初学者级别的系统课程,我的教授提到不能更改数组大小,因为它们是在内存中设置的。

此外,C 中的字符串只是字符数组。

所以我的问题是,当长度本身不能更改时,如何使用 strcpy 复制不同长度的字符串?

(目前凌晨 2:30,1 天后考试)

抱歉,这是一个初学者的问题,但非常感谢任何帮助!谢谢:)

【问题讨论】:

  • 时间不早了——考前休息一下吧。
  • 如果它们的长度是固定的,那么 strcpy 会在内存中分配新的大小并将两个数组复制到其中。
  • 正如@coderredoc 所说 - 休息一下。支撑你理解的部分。考前吃好早餐,喝点水。这对大脑有好处。
  • 所有字符串都是 - 是一个带有 '\0'nul 终止字符)的字符数组,它告诉您字符串的结尾在哪里。 (当然,字符串可以简单地是内存中的连续字节,但您会发现偏差 -- “如果它不是以 nul 结尾的 -- 它不是字符串”) 并且您不能将它作为参数传递给 string.h 中的函数,该函数需要一个字符串,因为该函数将无法确定字符串的结尾在哪里,并且只会保留将字节读入你不拥有的内存中寻找一个直到真正糟糕的事情发生......
  • 感谢大家的帮助,真的解开了一些误解

标签: c arrays c-strings strcpy


【解决方案1】:

简单的答案是,即使我们使用strcpy 复制字符串,事实也不会改变。一旦声明数组的大小就不会改变。事实上假设你有一个 char 数组

char arr[]="helloworld"; //size of the array will be 11
strcpy(arr,"funny");

数组的大小是多少?与声明时相同。 11。它与原来的没有任何变化。

字符串的长度是多少?现在是5

String 是以空字符结尾的字符数组。这意味着数组可能有 100 元素,但字符串将以空字符结尾,它可以是任何值,例如 2 长度或 5 长度或任何可能的值,因为我们有空间用于存储 @987654330 @。

复制字符串并不意味着数组大小发生变化。

还要非常小心地注意一件事 - 字符串不仅仅是字符数组,这些字符末尾的 NUL 终止符使它成为字符串。

char s[4]="hell";

这是合法的 C 代码,不是字符串。 \0 没有空间。您不能将它与标准字符串库函数一起使用。问题是这不适用于strcpystrlen 等函数。因为这些实现取决于要被 NUL 终止的字符数组才能正常工作。

注意最后一个例子 - 写这个是Undefined behavior

char s[4]="hell";
size_t len = strlen(s);

不,你不能那样做。 strlen 期待一些东西而你没有给它。所以正确的说法应该是-(这是一个很好的描述性引用,我不记得出处了)

中,字符串不是固有类型。 C 字符串是具有一维字符数组的约定 它由一个空字符终止,由一个'\0' 终止。

1) 不记得引用的来源:如果有人确实告诉我。我把它保存在一个文件中。(不是主要来源)

【讨论】:

  • 啊,非常感谢,措辞非常好,所以很容易理解。现在会接受你的建议并去睡觉
  • 最后那句话出自哪里?归因可能是有序的。或者是你的措辞,放在引号中以强调?
  • @DavidBowling.: 我把它记下来了..但我担心我是从某个地方找到的。 (不是我的)..我不知道在这种情况下该怎么做。我想肯定地强调。我不知道来源。
  • 您可以在回答中提到您不知道来源。这是一个很好的报价。
  • @DavidBowling.: 你的意思是这样的From:Unknown source?好的。
猜你喜欢
  • 2021-07-04
  • 2012-05-27
  • 2023-01-12
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2021-08-28
  • 2012-04-12
  • 1970-01-01
相关资源
最近更新 更多