You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

整数文本行排序任务:冒泡排序代码中输出函数位置及排序完成判断

你的代码存在几个关键问题,先逐一拆解,再给出修正后的实现:

核心问题梳理

  1. 错误直接操作字符串数组:你现在直接对char line[]的元素进行数值比较,但line里存储的是字符(比如数字'1'的ASCII码是49),不是实际的整数值,判断首元素正负的逻辑完全错误。
  2. 整数个数计算错误:sizeof(line)/sizeof(line[0])得到的是字符数组的总长度,不是该行的整数数量,必须先把字符串分割成整数数组再统计个数。
  3. for循环语法错误:所有for循环里的分隔符用了逗号,,C语言里必须用分号;。
  4. 输出逻辑缺失:只有首元素为0时才输出,降序/升序排序后的行完全没写入文件。
  5. 冒泡排序的终止判断:你提到的排序完成时机,可以用一个布尔变量标记每轮是否发生交换,如果某一轮没有交换,说明数组已经有序,直接终止排序循环。

修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 冒泡排序:is_desc=1降序,is_desc=0升序
void bubble_sort(int arr[], int count, int is_desc) {
    for (int i = 0; i < count - 1; i++) {
        int swapped = 0; // 标记本轮是否有交换
        for (int j = 0; j < count - i - 1; j++) {
            int should_swap = 0;
            if (is_desc) {
                should_swap = (arr[j] < arr[j+1]); // 降序:前小于后则交换
            } else {
                should_swap = (arr[j] > arr[j+1]); // 升序:前大于后则交换
            }
            if (should_swap) {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                swapped = 1;
            }
        }
        if (!swapped) {
            break; // 本轮无交换,数组已有序,提前退出
        }
    }
}

int main(void) {
    FILE *input = fopen("int_numbers.txt", "r");
    if (input == NULL) {
        fprintf(stderr, "Failed to open input file\n");
        return 1;
    }

    FILE *output = fopen("result.txt", "w");
    if (output == NULL) {
        fprintf(stderr, "Failed to open output file\n");
        fclose(input);
        return 2;
    }

    char line[300];
    int nums[30]; // 每行最多30个整数,定义对应数组
    while (fgets(line, sizeof(line), input) != NULL) {
        int count = 0;
        char *token = strtok(line, " \n\t"); // 分割空格、换行、制表符

        // 将字符串分割为整数数组
        while (token != NULL && count < 30) {
            nums[count++] = atoi(token);
            token = strtok(NULL, " \n\t");
        }

        if (count == 0) {
            fputs(line, output); // 空行直接写入
            continue;
        }

        // 根据首元素判断排序规则
        if (nums[0] > 0) {
            bubble_sort(nums, count, 1); // 降序排序
        } else if (nums[0] < 0) {
            bubble_sort(nums, count, 0); // 升序排序
        }
        // 首元素为0时不处理,保持原序

        // 写入处理后的结果
        for (int i = 0; i < count; i++) {
            if (i > 0) fputc(' ', output); // 元素间加空格分隔
            fprintf(output, "%d", nums[i]);
        }
        fputc('\n', output); // 每行结束加换行
    }

    fclose(input);
    fclose(output);
    return 0;
}

关键细节解释

  1. 字符串转整数数组:用strtok分割每行字符串,atoi将分割后的字符转成整数,同时统计有效整数的个数count。
  2. 带提前终止的冒泡排序:新增swapped变量,每轮排序后如果没有发生交换,说明数组已经有序,直接跳出循环,减少不必要的迭代次数。
  3. 统一输出逻辑:不管是排序后的数组还是原序数组,都在处理完成后统一写入文件,避免输出遗漏。
  4. 错误处理优化:用fprintf(stderr, ...)输出错误信息,符合C语言标准错误输出规范,同时在打开输出文件失败时主动关闭已打开的输入文件,避免资源泄漏。

内容的提问来源于stack exchange,提问作者kujosyyyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:41:11