字符串长度

时间:2011-02-25 11:53:46

标签: c++ c

字符串操作问题

http://www.ideone.com/qyTkL

在上面的程序中(在C ++ Primer,第三版作者Stanley B. Lippman,JoséeLajoie练习3.14中给出),字符指针的长度为len + 1

char *pc2 = new char[ len + 1];

http://www.ideone.com/pGa6c 但是,在这个程序中,我所采用的字符指针的长度是len

char *pc2 = new char[ len ];

当我们得到相同的结果时,为什么需要将新字符串的长度设置为1。请解释一下。

请注意,我在此处显示的程序略有改动。与书中的不完全相同。

3 个答案:

答案 0 :(得分:7)

要在C中存储长度为n的字符串,您需要n + 1 char s。这是因为C中的字符串只是由空字符char终止的\0数组。因此,存储字符串“hello”的内存看起来像

'h' 'e' 'l' 'l' 'o' '\0'

并且由6个char组成,即使单词hello只有5个字母长。

你所看到的不一致可能是一个语义错误;有人会说单词hello的长度是len = 5,所以我们需要分配len+1 char s,而有些人会说,因为你好需要6 char s我们应该说它length(作为C字符串)是len=6

顺便说一下,注意存储字符串的C方式不是唯一可能的方法。例如,可以将字符串存储为整数(给出字符串的长度),后跟字符。 (我相信这是帕斯卡所做的?)。如果不使用像这样的长度字段,则需要另一种方法来知道字符串何时停止。 C方式是只要到达空字符,字符串就会停止。

要了解其工作原理,您可能需要尝试以下操作:

char* string = "hello, world!";
printf("%s\n", string);
char* string2 = "hello\0, world!";
printf("%s\n", string2);

(赋值char* string = "foo";只是创建一个包含4个元素的数组的简写方法,第一个给出值'f',第二个'o',第三个'o',和第四个'\ 0')。

答案 1 :(得分:1)

这是一个约定,字符串由一个额外的空字符终止,因此无论谁分配存储都必须分配len + 1个字符。

答案 2 :(得分:0)

它会导致问题。但是,有时候,当len未对齐时,操作系统会在其后添加一些字节,因此隐藏了问题。