为何持续出现‘char数组初始化器元素过多’编译错误?
解决C++中char数组初始化错误及字符串匹配问题
第一个错误:excess elements in char array initializer 的原因和修复
你写的char charversiyonu[] = {"E","v","r","i","m"};存在语法错误:双引号包裹的是字符串字面量(const char*类型),而char数组的每个元素应该是单个字符,必须用单引号包裹。
正确的初始化方式有两种:
- 单个字符初始化:
char charversiyonu[] = {'E','v','r','i','m'}; - 更简洁的字符串字面量初始化(会自动添加字符串终止符
'\0',但注意此时数组实际长度是6):
如果用这种方式,调用char charversiyonu[] = "Evrim";esittir时要注意传入的size应该是strlen(charversiyonu)而不是硬编码的5,避免因为终止符导致长度判断错误。
关于指针转换后比较失败的问题
你把数组转成指针后,无法直接获取原数组的真实长度,而且如果初始化错误没修复,数组里存的根本不是你想要的字符(而是字符串指针的地址),自然会导致比较逻辑失效。只要先修复初始化错误,不需要随便转指针就能正常运行。
修正后的完整代码
#include <iostream> #include <string> using namespace std; // 优化:string参数传const引用,避免不必要的拷贝 bool esittir(char char_array[], int size, const string& str_array) { if(size != str_array.length()) return false; for (int i = 0; i < size; i++) if(char_array[i] != str_array[i]) return false; return true; } void print(string names[], int size) { for (int i = 0; i < size; i++) { for (int j = 0; j < names[i].length(); j++) cout << names[i][j] << " , "; cout << endl; } } int main () { string Names [] = {"Evrim","Can","Bayhan"}; string ilk_isim = "Evrim"; // 修复char数组初始化 char charversiyonu[] = {'E','v','r','i','m'}; print(Names,3); // 输出1表示匹配成功,0表示失败 cout << esittir(charversiyonu,5,ilk_isim) << endl; return 0; }
额外优化建议
- 对于char数组的长度,可以用
sizeof(charversiyonu)/sizeof(char)来自动计算,避免硬编码数字出错,比如:
注意:这种方式只有在数组没有退化为指针时才有效,比如不能在函数内部用这种方式获取参数里的char数组长度。int char_size = sizeof(charversiyonu)/sizeof(char); cout << esittir(charversiyonu, char_size, ilk_isim) << endl;
内容的提问来源于stack exchange,提问作者ecbayhan290
相关产品推荐
相关产品推荐

