字符串操作问题
在上面的程序中(在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。请解释一下。
请注意,我在此处显示的程序略有改动。与书中的不完全相同。
答案 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
未对齐时,操作系统会在其后添加一些字节,因此隐藏了问题。