K&R 《C程序设计语言》第1章导言练习1-22

By | November 2, 2018

练习1-22
编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。

/*================================================================
*   Copyright (C) 2018 Navin Xu. All rights reserved.
*   
*   Filename    :p025-1.10-ex1-22.c
*   Author      :Navin Xu
*   E-Mail      :admin@navinxu.com
*   Create Date :2018年10月31日
*   Description : 将较长的输入行折断为两行或多行,要求指定的列前
*               没有空格
================================================================*/
#include <stdio.h>

#define MAXLINE 2000
#define MAX_COLUMN 19

int mygetline(char line[], int maxline);
void make_newline(char input[], char output[], int max_column);

int main() {

    int len, newline_len;
    char line[MAXLINE];

    newline_len = 0;
    len = 0;
    while ((len = mygetline(line, MAXLINE)) > 0) {
        //printf("%d, %s", len, line);
        if (len % (2 * MAX_COLUMN) == 0) 
            newline_len = MAXLINE + len / MAX_COLUMN - 1;
        else
            newline_len = MAXLINE + len / MAX_COLUMN;

        char newline[newline_len];
        make_newline(line, newline, MAX_COLUMN);
        printf("%s", newline);
    }
    printf("++");


    return 0;
}


int mygetline(char line[], int maxline) {
    int c, i;

    for (i = 0; i < maxline - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        line[i] = c;

    if (i ==  maxline - 1)
        while ((c = getchar()) != '\n');

    if (c == '\n') {
        line[i] = c;
        ++i;
    }

    line[i] = '\0';
    return i;
}

void make_newline(char input[], char output[], int max_column) {
    int i;

    for (i = 1; ((* input) != '\0') && ((* output) = (* input)); i++, input ++, output ++) {

        if (i % max_column == 0) {
            output ++;
            (* output) = '\n';             

            input ++;
            if (((* input) == ' ') || ((* input) == '\t')) {
                char space = 0;
                while (((* input) == ' ') || ((* input) == '\t')) {
                    input ++;
                    space = 1;
                }

                if (space)
                    input --;
            } else {
                input --;
            }
        }
    }

    (* output) = (* input);
}

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,也欢迎指正,一起学习,共同进步。如果本文对您有帮助,而且让您觉得值得为内容付费,那么就请赞助(打赏)一下本人,这不强制。打赏支持微信支付,方法是使劲地戳一下下方的“打赏”按钮,然后得到微信收款的二维码,再用微信支付扫一下,就像买菜那样。祝好!