C语言学习笔记(十一)

C语言学习第十一天,今天继续做第一章的练习题

#include

#define SPLITMUN 8 /* 分割限制字符数 */
#define MAXLINE 1000    /* 最大输入行数量 */

/* 练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能地处理输入行很长以及在指定列前没有空格或制表符时的情况。 */
main() {
    int c, i, j, nchar, nsplit;
    char line[MAXLINE + 1];

    i = nchar = 0;
    while ((c = getchar()) != EOF && nchar < MAXLINE)
    {
        if (c == '\n') { /* 一行输入结束后 */
            if (nchar >= SPLITMUN) { /* 如果当前输入字符数大于分割限制字符数,则考虑折行 */
                for (i = 0; i < nchar/SPLITMUN; i++) { // 把每次输入的行分割成多行
                    nsplit = (i+1) * SPLITMUN - 1; // 每次分割的上限
                    while (line[nsplit] == ' ' && nsplit >= i * SPLITMUN) // 每次先把后面的空格去掉
                        nsplit--;

                    /* 从第二行开始 把前面的空格删除掉 */
                    j = i * SPLITMUN;
                    if (j > 0)
                        while (line[j] == ' ')
                            j++;

                    if(j <= nsplit) {
                        /*数出非空格字符*/
                        for (; j <= nsplit; j++)
                            putchar(line[j]);
                        putchar('\n');
                    }
                }

                i = nchar - nchar%SPLITMUN;

                if (i < nchar) {
                    while (line[i] == ' ') // 把前面的空格去掉
                        i++;
                    for(; i < nchar; i++) // 输出非空字符
                        putchar(line[i]);
                     putchar('\n');
                }
            } else {
                for(i = 0; i < nchar; i++)
                    putchar(line[i]);
                putchar('\n');
            }
            nchar = 0;
        } else {
            line[nchar] = c; // 如果未达到最大输入字符,将所输入字符保存到字符数组中,用于一会进行折行
            ++nchar;
        }
    }
}

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