一个完整的小工具跑一遍

👁️ 0 人浏览 💬 0 人评论 ❤️ 添加收藏

(本条路线统一用 gcc -std=c11 -O0 -Wall 编译)参数 → 临时文件 → 读回来 → 存进堆 → 算 → 全还回去:

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

static int got = 0, gave = 0;

#define OK       0
#define E_INPUT  2

/* 一个真实小工具的骨架:读入 → 处理 → 写出 → 收尾,每步都有回执 */
static int tool(int argc, char **argv, int *out_rows, int *out_total) {
    if (argc < 2) return E_INPUT;

    FILE *f = tmpfile();
    if (f == NULL) return E_INPUT;
    for (int i = 1; i < argc; i++) fprintf(f, "%s\n", argv[i]);
    rewind(f);

    char **kept = malloc((size_t)(argc - 1) * sizeof(char *));
    got++;

    char word[32];
    int rows = 0, total = 0;
    while (rows < argc - 1 && fscanf(f, "%31s", word) == 1) {
        kept[rows] = malloc(strlen(word) + 1);
        got++;
        strcpy(kept[rows], word);
        total += (int)strlen(word);
        rows++;
    }
    fclose(f);

    for (int i = 0; i < rows; i++) { free(kept[i]); gave++; }
    free(kept); gave++;

    *out_rows = rows;
    *out_total = total;
    return OK;
}

int main(void) {
    char *fake[] = {"tool", "apple", "pear", "fig", NULL};
    int rows = 0, total = 0;
    int rc = tool(4, fake, &rows, &total);

    int rows2 = 0, total2 = 0;
    int rc2 = tool(1, fake, &rows2, &total2);   /* 参数不够,该失败 */

    printf("%d/%d/%d/%d/%d\n", rc, rows, total, rc2, got - gave);
    return 0;
}
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论