如何在C语言中获取预定义字符串数组的元素个数?
C语言数组元素计数问题的解决方法
为什么原代码不行?
当数组作为函数参数传递时,C语言会自动将其转换为指向首元素的指针。这意味着在countStrings函数里,sizeof(strArray)拿到的是指针的字节数(32位系统为4,64位系统为8),而非整个数组的总字节数。用这个值除以单个元素的大小,结果必然错误。
三种可行解决方案
方案1:在数组定义处计算个数后传参
只有在数组定义的作用域(比如main函数内),sizeof才能正确获取数组的总大小。先在这里计算好元素个数,再传递给函数:
typedef char String[100]; int countStrings(String strArray[], int count) { // 可在此添加数组处理逻辑,直接返回count即可 return count; } int main() { String strArray[] = {"one", "two", "three"}; // 计算正确的元素个数 int numStrings = sizeof(strArray) / sizeof(strArray[0]); numStrings = countStrings(strArray, numStrings); printf("count: %d\n", numStrings); return 0; }
方案2:用宏封装计数逻辑
定义一个宏,在数组所在的作用域调用,编译期就能算出正确的元素个数,无需额外传参:
typedef char String[100]; // 宏定义:计算数组元素个数 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) int main() { String strArray[] = {"one", "two", "three"}; int numStrings = ARRAY_SIZE(strArray); printf("count: %d\n", numStrings); return 0; }
如果需要保留countStrings函数,将宏计算的结果传入即可,逻辑与方案1一致。
方案3:用结束标记遍历计数
如果可以修改数组,给它添加一个结束标记(比如空字符串),就能通过遍历到标记来统计个数:
typedef char String[100]; int countStrings(String strArray[]) { int count = 0; // 遍历直到遇到空字符串 while (strArray[count][0] != '\0') { count++; } return count; } int main() { // 末尾添加空字符串作为结束标记 String strArray[] = {"one", "two", "three", ""}; int numStrings = countStrings(strArray); printf("count: %d\n", numStrings); return 0; }
如果是char*类型的字符串数组,用NULL做结束标记更规范,但这里String是固定大小的char[100],所以用空字符串更合适。
内容的提问来源于stack exchange,提问作者OatiesMilk
相关产品推荐
相关产品推荐

