C语言编译警告:array subscript has type 'char' 问题咨询
解答:数组下标类型为
char的编译警告问题 首先,这个警告不是说你不能把current当作int值使用,而是编译器在提醒你:数组下标应该使用整数类型(比如int、unsigned int),而你现在用的是char类型——虽然在C语言中char会被隐式提升为int,但编译器会担心char作为有符号类型时,可能出现负数下标导致数组越界的风险,所以抛出这个警告。
为什么你的代码会触发这个警告?
你的代码里,current是char类型,虽然你已经通过逻辑过滤,确保它最终是小写字母(a-z),减去97后得到0-25的合法下标值,但编译器不会去分析你的业务逻辑,它只看到你用char类型直接作为数组下标,所以触发了这个类型检查警告。
解决方法
有两种简单的方式可以消除这个警告:
方法1:显式将current转换为int类型
在使用下标时,强制转换类型,告诉编译器你确认这个值是合法的整数下标:
void count(int arr[N]) { char current; while(scanf(" %c", ¤t) > 0 && (current != '#')) { if(current >= 'A' && current <= 'Z') { current += 32; } else if(current < 'a' || current > 'z') { continue; } current -= 97; arr[(int)current]++; // 显式转换为int类型 } }
方法2:直接将current的类型改为int
既然你后续需要把它当作整数来运算和作为下标,直接把current定义为int类型会更稳妥,也避免了隐式类型转换的问题:
void count(int arr[N]) { int current; // 改为int类型 while(scanf(" %c", ¤t) > 0 && (current != '#')) { if(current >= 'A' && current <= 'Z') { current += 32; } else if(current < 'a' || current > 'z') { continue; } current -= 97; arr[current]++; // 下标为int类型,无警告 } }
两种方法都能解决问题,第二种更直接,因为scanf读取%c到int变量里完全合法,后续的数值运算也更符合你对这个变量的使用场景。
内容的提问来源于stack exchange,提问作者verrrilog
相关产品推荐
相关产品推荐

