面试题答案
一键面试实现思路
- 定义字符串指针数组:首先,定义一个指针数组,用于存储二维字符数组中每个字符串的首地址。这样,通过操作指针数组,就能间接操作字符串。
- 字符串排序:使用一种排序算法(如冒泡排序、快速排序等)对指针数组进行排序。在比较时,利用
strcmp
函数来比较两个指针所指向的字符串,以确定它们的字典序。 - 更新二维字符数组:排序完成后,根据指针数组的顺序,更新二维字符数组中字符串的顺序。
代码实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 比较函数,用于qsort
int compare(const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
void sortStrings(char arr[][100], int n) {
char *pointers[100]; // 假设最多100个字符串
int i;
// 初始化指针数组
for (i = 0; i < n; i++) {
pointers[i] = arr[i];
}
// 使用qsort对指针数组进行排序
qsort(pointers, n, sizeof(char *), compare);
// 更新二维字符数组
for (i = 0; i < n; i++) {
strcpy(arr[i], pointers[i]);
}
}
int main() {
char arr[][100] = {"banana", "apple", "cherry"};
int n = sizeof(arr) / sizeof(arr[0]);
sortStrings(arr, n);
int i;
for (i = 0; i < n; i++) {
printf("%s\n", arr[i]);
}
return 0;
}
可能出现的问题及解决办法
-
内存泄漏:
- 问题:如果在动态分配内存来存储字符串指针或字符串本身时,没有正确释放内存,就会导致内存泄漏。例如,如果使用
malloc
分配了存储字符串的空间,但没有调用free
。 - 解决办法:确保所有动态分配的内存都有对应的释放操作。在本代码中,由于使用的是固定大小的二维数组,不存在动态分配内存的情况,所以没有内存泄漏风险。但如果是动态分配的内存,在使用完后要及时调用
free
。
- 问题:如果在动态分配内存来存储字符串指针或字符串本身时,没有正确释放内存,就会导致内存泄漏。例如,如果使用
-
越界问题:
- 数组越界:
- 问题:在访问二维字符数组或指针数组时,如果索引超出了有效范围,就会发生越界。例如,在
sortStrings
函数中,如果n
是一个非法值(如负数或大于数组实际大小),访问arr[i]
或pointers[i]
就会越界。 - 解决办法:确保在访问数组时,索引值在有效范围内。在本代码中,
n
是通过sizeof(arr) / sizeof(arr[0])
正确计算得出的,保证了索引的有效性。
- 问题:在访问二维字符数组或指针数组时,如果索引超出了有效范围,就会发生越界。例如,在
- 字符串越界:
- 问题:在使用
strcpy
等字符串操作函数时,如果目标缓冲区大小不足以容纳源字符串(包括终止符\0
),就会导致字符串越界。例如,如果arr[i]
的大小不足以存储pointers[i]
指向的字符串。 - 解决办法:确保目标缓冲区足够大来存储源字符串。在本代码中,
arr
数组的每个元素大小为100,假设所有字符串长度都不会超过99,保证了strcpy
操作的安全性。如果是动态分配的目标缓冲区,要根据源字符串长度动态分配足够大小的空间。
- 问题:在使用
- 数组越界: