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

如何用C语言将文本文件中的单行内容拆分为多行输出

如何将单行订单文本拆分为指定多行格式并修改C语言读取代码

拆分逻辑说明

你的订单文本结构是:开头为用户名,后续每个商品条目以DRxx/SWxx/SKxx格式的编码开头,包含商品名称(可能带空格)和价格。要得到目标多行格式,遵循以下规则:

  1. 提取第一个连续非空白字段作为单独一行;
  2. 从剩余内容里,每次定位到下一个DR/SW/SK开头的编码位置,将两个编码之间的内容(包含前一个编码)作为一行;
  3. 处理最后一个条目,直到文本结束。

修改后的C语言AddOdr函数代码

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

void AddOdr() {
    FILE *fp = fopen("temp.txt", "r");
    if (!fp) {
        perror("Failed to open file");
        return;
    }

    // 读取整行内容(假设单行内容不超过缓冲区大小)
    char buffer[1024];
    if (fgets(buffer, sizeof(buffer), fp) == NULL) {
        perror("Failed to read file");
        fclose(fp);
        return;
    }
    fclose(fp);

    char *ptr = buffer;
    // 跳过开头空白字符
    while (isspace((unsigned char)*ptr)) ptr++;

    // 提取用户名(第一个非空白字段)
    char *username_end = ptr;
    while (!isspace((unsigned char)*username_end)) username_end++;
    printf("- %.*s\n", (int)(username_end - ptr), ptr);

    ptr = username_end;
    // 跳过用户名后的空白字符
    while (isspace((unsigned char)*ptr)) ptr++;

    // 处理每个商品条目
    while (*ptr != '\0') {
        // 记录当前条目的起始位置
        char *entry_start = ptr;
        // 寻找下一个条目的起始(DR/SW/SK开头)
        char *next_entry = ptr + 1;
        while (*next_entry != '\0') {
            // 检查是否是DR/SW/SK开头
            if ((*next_entry == 'D' && *(next_entry+1) == 'R') ||
                (*next_entry == 'S' && *(next_entry+1) == 'W') ||
                (*next_entry == 'S' && *(next_entry+1) == 'K')) {
                // 跳过前面的空白,确保是新条目的开头
                char *temp = next_entry;
                while (temp > entry_start && isspace((unsigned char)*(temp-1))) temp--;
                if (temp == next_entry) {
                    break;
                }
            }
            next_entry++;
        }

        // 输出当前条目,去除末尾多余空白
        char *entry_end = next_entry;
        while (entry_end > entry_start && isspace((unsigned char)*(entry_end-1))) entry_end--;
        printf("- %.*s\n", (int)(entry_end - entry_start), entry_start);

        // 移动指针到下一个条目
        ptr = next_entry;
        // 跳过空白字符
        while (isspace((unsigned char)*ptr)) ptr++;
    }
}

代码关键说明

  1. 读取整行:用fgets读取单行文本到缓冲区,避免逐字符处理的低效;
  2. 提取用户名:定位第一个非空白字段的起止位置,单独输出;
  3. 识别商品条目:通过检查DR/SW/SK前缀来定位每个条目的分界点;
  4. 清理空白:输出前去除每个条目末尾的多余空白,保证格式整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:05:23