C语言二维字符串数组排序飓风名称异常问题排查
问题排查结果
- 核心故障:字符串交换逻辑完全错误,存在数组越界访问
现有交换代码不符合C语言二维字符数组的操作规则:// 错误代码片段 temp = list[index_of_min]; list[index_of_min][LINE_LENGTH] = list[fill][LINE_LENGTH]; list[fill][LINE_LENGTH] = *temp;- 你定义的
LINE_LENGTH为60,数组合法下标范围是0~59,访问[LINE_LENGTH]属于越界写操作,直接篡改了相邻字符串的头部内容,就是首字符异常的直接原因。 - C语言不能直接对数组名赋值,交换两个字符串需要用
strcpy配合临时字符数组实现,不能用指针简单赋值。
- 你定义的
- 次要冗余/错误点
- main函数中读取完文件后重复打开拼写错误的
hurricanes.cvs(正确后缀是csv),未关闭旧文件指针,属于资源泄漏,不过不直接影响排序结果。 - 定义的
outp文件指针、num变量完全未使用,就是编译警告的来源。
- main函数中读取完文件后重复打开拼写错误的
修正后的核心代码
仅修改select_sort_str函数的交换逻辑即可,冗余代码可自行清理:
void select_sort_str(char list[][LINE_LENGTH], // 输入输出:待排序的字符串数组 int n) // 输入:待排序元素数量 { int fill, // 下一个有序元素的存放下标 index_of_min; // 下一个有序元素的原始下标 char temp[LINE_LENGTH]; // 改用临时数组存储字符串 for (fill = 0; fill < n - 1; ++fill) { index_of_min = alpha_first(list, fill, n - 1); if (index_of_min != fill) { // 用strcpy完成字符串交换 strcpy(temp, list[index_of_min]); strcpy(list[index_of_min], list[fill]); strcpy(list[fill], temp); } } for( int i =0; i<NUM_LINES; i++){ printf("%s", list[i]); } }
修正后运行即可得到按飓风名称字母序正确排序的结果,不会再出现字符被篡改的问题。
内容的提问来源于stack exchange,提问作者Ivickt
相关产品推荐
相关产品推荐

