我有两种类型的数组初始化将用于字符串构造函数
$(function () {
$("input:enabled").filter(function () {
if ($(this).attr("type") == "checkbox" || $(this).attr("type") == "radio")
return $(this).val().trim() == "" || !this.checked;
else
return this.value.trim() == "";
}).first().focus();
});
为什么在int main() {
//char foo [] = { 'a', 'd' };
char foo[] = "ad";
std::string s = foo;
cout<<s;
int i;
cin >> i;
}
情况下我有输出:
char foo [] = { 'a', 'd' };
当数组初始化为ad╠╠╠╠╠╠R8$1↑■╬
时,我的输出正常 - char foo [] = "ad";
- 在第一种情况下是预期的。
这两个数组初始化的区别是什么?为什么我在第一个数组中输出垃圾?
答案 0 :(得分:3)
您需要将字符串空终止
char foo [] = { 'a', 'd', '\0' };
字符串文字已经空终止。
§2.14.5字符串文字
8普通字符串文字和UTF-8字符串文字也称为窄字符串文字。 窄字符串文字的类型为“数组n
const char
”,其中n是下面定义的字符串大小,并且具有静态存储持续时间14在任何必要的连接之后,在翻译阶段7中,
'\0'
被附加到每个字符串文字,以便扫描字符串的程序可以找到它的结尾。
答案 1 :(得分:1)
在char foo [] = { 'a', 'd' };
的情况下,您声明了一个包含两个元素的字符数组,即不是以空字符结尾的字符串。因此,当您尝试将其作为字符串打印时,<<
运算符将继续读取发生的任何字符,直到找到空字节为止。这是未定义的行为。
在char foo [] = "ad";
的情况下,您正在使用字符串常量初始化字符数组。该常量有3个字符,即“a”,“d”和空字节,因此数组长度为3个字符。因此,当您打印时,它会正确打印。
答案 2 :(得分:1)
char foo[] = "ad";
实际上会创建一个<{1}}数组
char
char foo[] = { 'a', 'd', '\0' };
很重要,因为它用于表示char数组的结尾。创建字符串'\0'
时,会读取s
的内容,直到达到foo
为止。输出'\0'
后,您会获得s
。当你这样做
ad
没有char foo [] = { 'a', 'd' };
因此,当您创建字符串'\0'
时,构造函数将继续运行,直到达到s
。这是未定义的行为,因为我们正在使用我们尚未分配的内存。
答案 3 :(得分:0)
写作时
std::string = foo; // copy ctor -- for std::string will be called
期望以null终止(C样式)字符串。但是在以下情况下,您没有空字符来终止C样式字符串。
char foo [] = { 'a', 'd' }; // Incorrect
char foo[] = { 'a', 'd' ,'\0'}; //Correct
以下情况很好,因为编译器会为您生成一个空终止C字符串。
char foo[] = "ad";
还有一点需要注意,“ad”是一个字符串文字,{'a','d','\ 0'}是一个数组初始值设定项。以下是值得注意的
char[] foo = "ad";
foo[1] = 'M'; // Undefined behavior
char[] foo = { 'a', 'd' ,'\0'};
foo[1] = 'M'; // Is OK