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
的倍数时,就相当于增加了一个额外的列数,确保不会遗漏字符。