Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 弦长_C++_C - Fatal编程技术网

C++ 弦长

C++ 弦长,c++,c,C++,C,字符串操作问题 在上面的程序中(在C++入门书中,Stanley B. Lippman的第三版,Joee e LaJoee练习3.14)所取的字符指针的长度为Le+ 1</P> char *pc2 = new char[ len + 1]; 然而,在这个程序中,我使用的字符指针的长度是len char *pc2 = new char[ len ]; 当我们得到相同的结果时,为什么需要将新字符串的长度取大1。请解释一下 请注意,我在这里展示的程序稍有改动。和书中的不完全一样 要在C中存储长

字符串操作问题

在上面的程序中(在C++入门书中,Stanley B. Lippman的第三版,Joee e LaJoee练习3.14)所取的字符指针的长度为Le+ 1</P>

char *pc2 = new char[ len + 1];
然而,在这个程序中,我使用的字符指针的长度是len

char *pc2 = new char[ len ];
当我们得到相同的结果时,为什么需要将新字符串的长度取大1。请解释一下


请注意,我在这里展示的程序稍有改动。和书中的不完全一样

要在C中存储长度为n的字符串,需要n+1
char
s。这是因为C中的字符串只是以空字符
\0
结尾的
char
s数组。因此,存储字符串“hello”的内存如下所示

'h' 'e' 'l' 'l' 'o' '\0'
它由6个字符组成,尽管hello这个词只有5个字母长

你看到的不一致可能是语义上的不一致;有些人会说hello这个词的长度是len=5,所以我们需要分配
len+1
char
s,而有些人会说既然hello需要6
char
s,我们应该说它的长度(作为一个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”).

按照惯例,字符串以一个额外的空字符结尾,因此无论谁分配存储,都必须分配
len+1
字符。

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

@Xaero:你只是没有观察到任何问题。然而它会在您最不期望的时候以某种微妙的方式中断。@Xaero,取决于输入字符串的长度,如果您将
len
设置为5,并传入“Hello”,问题是没有存储
\0
的位置,如果传入“foo”,则有空间。@Xaero:因为每当您跨越数组的边界时,它都是未定义的行为,也就是说,程序可以崩溃,正常运行,点比萨饼,还可以做任何它想做的事情。。。从技术上讲:)@Acme:这是一个约定-必须有那个空字符,以便操纵字符串的人知道字符串的结尾。@Acme这只是一个约定。如果数组由字符组成,并且以“\0”结尾,则它是一个字符串。人类可能想读的东西。否则,您可以通过字节方式访问的只是一堆大小为(char)的字节。所有使用字符串的函数都希望字符串以'\0'(零-)结尾。在字节数组上操作的函数需要一个长度参数来告诉您它有多长。但这只是C和C++中的一个约定。顺便说一下,这是C++,你应该使用STD::string和STD::char数组的向量。你确定这两者中的一个不是使用StrLLN(String)+ 1吗?strlen给出字符串的长度,不包括
'\0'
。通常,当您使用strlen时,会在strlen的行中添加+1。