L1-039 古风排版

#include <stdio.h>  // 包含标准输入输出头文件
#include <string.h>  // 包含字符串处理头文件

int main() {
    int N;  // 每列的字符数
    char str[1001];  // 存储输入的字符串,最大长度为1000
    char output[100][100] = {0};  // 输出矩阵,用于存储排版后的字符,初始化为0
    int len, rows, cols;  // len是输入字符串的长度,rows和cols是排版后的行列数

    scanf("%d", &N);  // 输入每列的字符数
    getchar();  // 吃掉前面输入数字后产生的换行符
    fgets(str, sizeof(str), stdin);  // 输入字符串,最多读取1000个字符

    len = strlen(str);  // 获取字符串的长度(包含换行符)

    // 去掉字符串末尾的换行符
    if (str[len - 1] == '\n') {  // 判断是否存在换行符
        str[len - 1] = '\0';  // 去掉换行符
        len--;  // 更新字符串长度
    }

    // 计算需要的列数,cols为列数,计算公式是将字符串长度除以每列字符数
    cols = (len + N - 1) / N;  // 向上取整的列数

    // 将字符串按古风排版填充到矩阵中
    for (int i = 0; i < len; i++) {  
        int row = i % N;  // 当前字符所在的行(循环填写每列的字符)
        int col = cols - 1 - i / N;  // 当前字符所在的列(从右向左填充)
        output[row][col] = str[i];  // 将字符放入对应位置
    }

    // 输出排版后的结果
    for (int i = 0; i < N; i++) {  // 遍历每一行
        for (int j = 0; j < cols; j++) {  // 遍历每一列
            if (output[i][j] == 0) {  // 如果该位置没有字符
                printf(" ");  // 输出空格
            } else {  
                printf("%c", output[i][j]);  // 输出对应的字符
            }
        }
        printf("\n");  // 输出换行符
    }

    return 0;  // 程序结束
}

1. getchar(); 的作用

  • 功能:getchar() 从标准输入(通常是键盘)读取一个字符。在这里,它的作用是“吃掉”输入缓冲区中残留的换行符(\n)。
  • 为什么需要它:当你使用 scanf("%d", &N); 读取整数 N 时,用户输入数字后按下回车键,换行符(\n)会被留在输入缓冲区中。如果不处理这个换行符,接下来的 fgets 会直接读取这个换行符,导致 fgets 读取到一个空行。

2.为什么使用 (len + N - 1) / N:

这个公式通过加上 N - 1 来模拟向上取整。它的原理是:

  • len / N 只会舍去小数部分,得到的是整数部分。
  • 加上 N - 1 后,当 len 不是 N 的倍数时,就相当于增加了一个额外的列数,确保不会遗漏字符。

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务