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

如何在C语言中将图案打印逻辑封装为可返回图案的函数

C语言图案生成功能实现方案

核心调整点

  • 补充首行完整原字符串的输出逻辑,修复原有代码缺失首行的问题
  • 将直接打印到控制台的逻辑改为写入动态分配的字符缓冲区,支持将生成的图案作为返回值返回
  • 封装为独立函数,支持传入重复次数参数,灵活控制图案的重复输出次数
  • 完全兼容原有图案的缩进、字符裁剪规则

完整可运行代码

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

char* generate_pattern(const char* input, int repeat_times) {
    int len = strlen(input);
    // 计算单组图案的行数
    int line_count = (len + 1) / 2;
    // 计算所需总内存:单组行数*(最大行长度+换行符) * 重复次数 + 字符串结束符
    int total_size = repeat_times * line_count * (len + 2) + 1;
    char* pattern = (char*)malloc(total_size);
    if (pattern == NULL) {
        return NULL;
    }
    char* ptr = pattern;

    for (int r = 0; r < repeat_times; r++) {
        // 输出首行完整字符串
        ptr += sprintf(ptr, "%s\n", input);
        // 输出后续递进裁剪行
        for (int i = 0; i < line_count - 1; i++) {
            // 输出前置缩进空格
            for (int k = 0; k <= i; k++) {
                *ptr++ = ' ';
            }
            // 输出裁剪后的字符
            for (int j = i + 1; j < len - 1 - i; j++) {
                *ptr++ = input[j];
            }
            *ptr++ = '\n';
        }
    }
    *ptr = '\0';
    return pattern;
}

int main() {
    char a[256];
    printf("enter string \n");
    scanf("%255[^\n]", a);

    // 生成重复2次的图案
    char* result = generate_pattern(a, 2);
    if (result != NULL) {
        printf("%s", result);
        free(result);
    }
    return 0;
}

关键逻辑说明

  • 动态内存分配:函数会根据输入字符串长度和重复次数自动计算所需内存,避免缓冲区溢出问题,返回的内存使用完成后需主动调用free释放。
  • 图案生成规则:保留原有代码的缩进和裁剪逻辑,额外补充了首行完整字符串的输出,符合需求的最终效果。
  • 可扩展性:如果需要调整重复次数,只需修改generate_pattern的第二个参数即可,无需改动核心生成逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:48:02