关于不指定数组大小的初始化
#include <bits/stdc++.h>using namespace std;
int main()
{
char str[]="123\0";
cout<<sizeof str<<endl;
return 0;
}
为什么这样会分配5个字节的空间给str呢?不应该是4个字节吗? 可能把你输入的'\0' 也算进去了吧, 然后再自动帮你添加了一个'\0' \ 一个字节, 0一个字节。。。 因为C++里面的字符串跟C里面的字符串是不一样的,C++的字符串更智能和安全一些,会自动在末尾添加\0。不过C++里面也可以使用C风格的字符串,下面str_1是C++风格字符串,str _2是C风格字符串:
char str_1[] = "123\0";
char str_2[] = {'1', '2', '3', '\0'};
cout << "str_1: " << str_1 << " len: " << sizeof( str_1 ) << endl;
cout << "str_2: " << str_1 << " len: " << sizeof( str_2 ) << endl;
运行结果:
str_1: 123 len: 5
str_2: 123 len: 4 str_1相当于{'1', '2', '3', '\0', '\0'} BFSDT 发表于 2018-4-26 12:46
因为C++里面的字符串跟C里面的字符串是不一样的,C++的字符串更智能和安全一些,会自动在末尾添加\0。不过C ...
c语言里面的char ch[]="123"不也是会自动添加\0吗? BFSDT 发表于 2018-4-26 12:50
str_1相当于{'1', '2', '3', '\0', '\0'}
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗? 御笔剑客 发表于 2018-4-26 12:54
c语言里面的char ch[]="123"不也是会自动添加\0吗?
c语言本身是没有string的,一切都要靠程序员自己实现,必须手动在末尾添加‘\0' 御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?
会自动补的
char str_1[] = "123\0";
int i = 0;
for (auto s : str_1){
++i;
cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
}
结果如下:
char1: 1 ASCII: 49
char2: 2 ASCII: 50
char3: 3 ASCII: 51
char4: ASCII: 0
char5: ASCII: 0 御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?
只有类型为string的时候才会进行相关的处理
string ss = "123\0";
for (char s : ss){
++i;
cout << "char" << i << ": " << s << " ASCII: " << int(s) << endl;
}
结果:
char1: 1 ASCII: 49
char2: 2 ASCII: 50
char3: 3 ASCII: 51
Process finished with exit code 0 御笔剑客 发表于 2018-4-26 12:56
书上写的不是如果人工补\0的话编译器不是不会再补\0了吗?
哪本书上写的?我去看看 BFSDT 发表于 2018-4-26 14:26
只有类型为string的时候才会进行相关的处理
c primer plus 那本书上写只要双引号括起来,编译器都会自动加上\0来着,如果手动加上,那就不会自动补了
页:
[1]