C++中char类型二维vector赋值字符输出乱码的原因
问题根因
vector的构造函数、assign方法完全支持char类型,前两种写法运行结果不符合预期,和类型支持无关,是犯了两个基础语法错误:
- 第一种写法参数顺序完全写反
vector的填充构造函数签名为vector(size_type count, const T& value, const Allocator& alloc = Allocator()),第一个参数是需要初始化的元素数量,第二个参数才是用来填充所有位置的初始值。
你写的vector<char> temp('#', N);中,第一个参数是字符'#',会被隐式转换为对应的ASCII整数值35,相当于告诉程序要创建35个元素;第二个参数是整型N,会被隐式转换为ASCII码值等于N的字符——大多情况下这个值对应的是不可打印的控制字符,最终打印自然出现乱码,元素数量也和预期的N个完全不符。 - 第二种写法同时存在两个错误
vector<char> temp();触发了C++经典的「最令人烦恼的解析」规则:编译器不会把这行识别为“定义一个名为temp的空vector对象”,而是会将其解析为“声明一个名为temp的函数,函数无入参、返回值类型为vector<char>”,后续对temp调用assign本身就是不符合预期的行为。- 就算修正了对象定义的写法,
temp.assign('.' , N);同样犯了参数顺序颠倒的错误:assign方法的填充语义和构造函数一致,第一个参数为元素个数,第二个为填充值,传'.'(对应ASCII值46)作为元素个数、N作为填充字符,得到的结果同样是错误的。
正确写法参考
你不需要写双层循环逐元素push_back来初始化,修正参数顺序、避开语法坑之后,代码可以写得非常简洁:
- 最简洁的一次性初始化写法,不需要手动写循环:
// 直接初始化N行,每行是N个'.'组成的char向量 vector<vector<char>> vec(N, vector<char>(N, '.'));
- 对应第一种写法的修正版:
vector<vector<char>> vec; for(int i = 0; i < N; i++) { // 注意第一个参数传元素个数N,第二个传填充字符'#' vector<char> temp(N, '#'); vec.push_back(temp); }
- 对应第二种写法的修正版:
vector<vector<char>> vec; for(int i = 0; i < N; i++) { // 定义空vector不要加空括号,避免被解析为函数声明 vector<char> temp; // 注意assign的参数顺序:第一个是个数,第二个是填充值 temp.assign(N, '.'); vec.push_back(temp); }
内容的提问来源于stack exchange,提问作者Mayank_pawar
相关产品推荐
相关产品推荐

