c 语言基础题目:L1-039 古风排版

        中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

        输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

        按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

程序源码: 

// 这一行用于关闭某些C运行时库的安全警告。  
#define _CRT_SECURE_NO_WARNINGS  
  
// 包含标准输入输出库,本程序使用到的printf和scanf函数均来源于此库  
#include   
  
// 定义主函数,C语言程序的入口  
int main() {  
    // 定义一个字符数组,用于存储用户输入的字符串  
    char buf[1001];  
  
    // 定义一个整型变量,用于接收用户输入的整数N  
    int N;  
  
    // 使用scanf函数从标准输入读取一个整数并存储到N变量中  
    scanf("%d", &N);  
  
    // 使用gets函数(这个函数在最新的C标准中已被废弃,建议使用fgets代替)从标准输入读取一行字符串并存储到buf数组中  
    // 注意,这里没有任何输入过滤和错误处理,如果输入的字符串超过了buf的大小(1001),那么就可能导致缓冲区溢出,这是一个潜在的安全隐患  
    gets(buf);  
  
    // 再使用gets函数读取一次字符串,同样存在安全问题,且这部分代码实际上并未被使用,可以删除  
    gets(buf);  
  
    // 使用strlen函数计算字符串的长度  
    int len = strlen(buf);  
  
    // 计算N行的总行数,算法为len除以N,如果len除以N有余数,则总行数加1  
    int line = len/N+(len%N!=0?1:0);  
  
    // 外层循环,控制行数,从0到N-1  
    for (int i = 0; i < N; i++)  
    {  
        // 内层循环,控制每行的字符数,从0到line-1  
        for (int j = 0; j < line; j++)  
        {  
            // 判断如果((line - j - 1) * N) + i小于len,即这个字符在buf中存在,则打印这个字符,否则打印空格  
            if(((line - j - 1) * N) + i

解题思路:

1.读取与存储:使用gets读取存储下来;

2.我们将其想象为一个二位的字符数组,根据下标的规律输出来即可。假定输入N=3 和012345678古风排版是

6 3 0
7 4 1
8 5 2

我们看到它的规律就是

(列数)*N ...... 1*N 0*N
(列数)*N+1 ...... 1*N+1 0*N+1
(列数)*N+2 ...... 1*N+2 0*N+2

        所以我们按这个规律输出即可,我们的列数是可以通过总字符的格式计算出来的,行数固定,通过列数=字符/行数,其中如果字符/行数不等与0,代表需要在加上一列。

第一列输出空格,这可以通过下标判断是否越界,如果越界输出空格,如果没有正常输出即可。

你可能感兴趣的:(c,c语言)