C语言结构体数组按name字段排序无效问题排查求助
问题排查:结构体数组按name排序未生效的原因
嘿,我一眼就瞅到你排序逻辑里的问题啦——内层循环的变量和条件写错了,这直接导致你的排序代码根本没按预期执行!
错误点分析
你原来的排序循环是这样的:
for (int r = 0; r < k - 1; r++) { for (int s = r + 1; r < k; r++) { // 这里出问题了! if (strcmp(student[r].name, student[s].name) > 0) { struct person temp = student[r]; student[r] = student[s]; student[s] = temp; } } }
看到没?内层循环的条件写的是r < k,而且每次迭代是r++——这相当于你在内层循环里直接修改了外层循环的变量r,内层循环的s变量根本没动过!结果就是外层循环的r会被快速递增,跳过大部分轮次,而且每次只比较了student[r]和student[r+1]一次,完全没实现冒泡排序需要的“逐个比较后续元素”的逻辑。
修正后的排序代码
把内层循环的变量和条件改成s相关的就好了:
for (int r = 0; r < k - 1; r++) { for (int s = r + 1; s < k; s++) { // 这里改成s < k,s++ if (strcmp(student[r].name, student[s].name) > 0) { struct person temp = student[r]; student[r] = student[s]; student[s] = temp; } } }
这样内层循环会从r+1开始,逐个遍历到数组末尾的s,每次比较student[r]和student[s]的name,只要前者更大就交换,真正实现按name升序排序的逻辑。
额外小提醒
虽然你说读取数据没问题,但还是可以确认下sscanf的格式字符串:" %99[^,], %99[^,], %19[^,], %d"里的逗号和空格是否和你txt文件里的分隔格式完全匹配,避免因为读取数据时的格式问题导致排序异常(不过这次的核心问题肯定是循环写错啦)。
内容的提问来源于stack exchange,提问作者Cgs
相关产品推荐
相关产品推荐

