如何在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
相关产品推荐
相关产品推荐

