在一行上最多打印50个字符,如果参数为55,则打印新的字符行

时间:2017-07-16 18:14:08

标签: c char printf

如果参数小于0,我想要绘制一行字符必须在该行上打印50个字符。如果参数超过50,则必须首先打印50个字符,然后新行继续打印字符,直到参数变为0。 当参数超过50时,我不知道如何在一行上打印前50个字符,然后在新行上打印剩余的字符

void drawLine(char c, int n){
    if(n<0){
        for(int i =0; i < 50; i++){
            printf("%c",c);
        }
    }
    else if(n>50){
        for(int i=0; i<50;i++){
            printf("%c",c);
            n--;
            if (n!=0 && i % 50 == 0){
                printf("\n");
                for(int i= 0; i<50;i++){
                    printf("%c",c);

                }
                break;
            } 

        }

    }
    else{
        for(int i=0;i<n;i++){
            printf("%c",c);
        }
    }
    printf("\n\n");
}

int main(void) {
    drawLine('*',55);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我尝试尽可能多地保留原始代码,同时使代码更清晰,更易读。 n大于50的问题是if (n != 0 && i % 50 == 0)对于第一次迭代始终为真,n高于50和i = 0,自0 % 50 = 0以来。因此,它只在第一行打印了一个而不是50个元素。

void drawLine (char c, int n) {
    //n less than zero equals n = 50
    if (n < 0) {n = 50;}

    //if printable on first line
    if (n <= 50) {
        for (int i = 0; i < n; i++) {
            printf("%c",c);
        }
    }

    else {
        //print 50 chars on first line
        for (int i = 0; i < 50; i++) {
            printf("%c",c);
        }
        //reduce n by this number
        n = n - 50;
        printf("\n");

        //print remaining number of chars
        for (int i = 0; i < n; i++) {
            printf("%c",c);
        }
    }

    printf("\n\n");
}

如果你想为每50个元素开始一个新行,那么每50次迭代开始一个新行的循环是可行的。

答案 1 :(得分:0)

通过稍微区别地思考问题,您可以大大简化逻辑。

首先,从不使用可变参数 printf函数输出单个字符 - 这是作业的错误工具。而是使用putchar()fputc 面向字符的输出函数 [1]

使用void函数时,没有理由不能在函数中的任何位置return。您可以利用此优势来避免在完成所需的代码块后,if{} else{}...简单return嵌套。

接下来,不要在整个代码中使用幻数。如果您需要50的常量,那么#define一个,例如

#define LNSZ 50

通过这种方式,如果您决定制作行大小60,则代码顶部只有一个可以轻松访问的位置,您可以在其中进行更改。无需通过多个for循环声明来选择更改每个循环限制。

将这些部分放在一起,您可以按如下方式重写drawline函数(注意:传统上C避免使用 camelCase 函数名称)

void drawline (char c, int n)
{
    if (n < 0) {                        /* handle value < 0  */
        for (int i = 0; i < LNSZ; i++)  /* output LNSZ chars */
            putchar (c);
        putchar ('\n');                 /* tidy up with '\n' */
        return;                         /* all done          */
    }

    for (int i = 0; i < n; i++) {       /* output n chars    */
        if (i && i % LNSZ == 0)         /* after every 50 \n */
            putchar ('\n');
        putchar (c);                    /* output char       */
    }
    putchar ('\n');                     /* tidy up with '\n' */
}

通过允许将行大小指定为命令行参数(并且如果没有给出参数使用默认值55)来组合一个简短示例来执行该函数,您可以执行类似于以下内容:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

#define LNSZ 50

void drawline (char c, int n)
{
    if (n < 0) {                        /* handle value < 0  */
        for (int i = 0; i < LNSZ; i++)  /* output LNSZ chars */
            putchar (c);
        putchar ('\n');                 /* tidy up with '\n' */
        return;                         /* all done          */
    }

    for (int i = 0; i < n; i++) {       /* output n chars    */
        if (i && i % LNSZ == 0)         /* after every 50 \n */
            putchar ('\n');
        putchar (c);                    /* output char       */
    }
    putchar ('\n');                     /* tidy up with '\n' */
}

int main (int argc, char **argv) {

    errno = 0;
    long v = argc > 1 ? strtol (argv[1], NULL, 10) : 55;

    if (errno) {    /* minimal validation of any strtol conversion */
        perror ("invalid conversion");
        return 1;
    }

    if (v < INT_MIN || INT_MAX < v) {   /* validate v in int range */
        fprintf (stderr, "error: value exceeds storable int.\n");
        return 1;
    }

    drawline ('*', (int)v);

    return 0;
}

示例使用/输出

$ ./bin/drawline
**************************************************
*****

$ ./bin/drawline 50
**************************************************

$ ./bin/drawline -1
**************************************************

$ ./bin/drawline 10
**********

$ ./bin/drawline 151
**************************************************
**************************************************
**************************************************
*

如果您还有其他任何问题,请仔细询问。

脚注[1] 是的,智能编译器可以为您优化printfputchar,但不要依赖编译器来修复懒惰的编码习惯。