Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 一行最多打印50个字符,如果参数为55,则打印一行新字符_C_Char_Printf - Fatal编程技术网

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

C 一行最多打印50个字符,如果参数为55,则打印一行新字符,c,char,printf,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

我想画一行字符,如果参数小于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;
}
void绘图线(字符c,整数n){
如果(n50){

对于(int i=0;i我试图保留尽可能多的原始代码,同时使代码更清晰、可读性更好。
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");
}
void绘图线(字符c,整数n){
//n小于零等于n=50
如果(n<0){n=50;}
//如果可在第一行打印

如果(n你可以通过稍微不同地思考问题来大大简化你的逻辑

首先,切勿使用variadic
printf
函数输出单个字符——这是错误的作业工具。相反,请使用
putchar()
fputc
这是面向字符的输出函数。[1]

在使用
void
函数时,没有理由不能从函数中的任何点
返回
。您可以利用这一点避免嵌套
,如果{}其他{}…
只需在完成所需的代码块后
返回

接下来,不要在代码中使用幻数。如果需要
50
的常数,则
#定义一个,例如

#define LNSZ 50
这样,如果您决定将行大小设置为
60
,则代码顶部只有一个易于访问的位置可以进行更改。无需为
循环声明选择多个
,即可更改每个循环限制

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

示例使用/输出

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

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

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

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

$ ./bin/drawline 151
**************************************************
**************************************************
**************************************************
*
如果你还有任何问题,请仔细检查一下,然后告诉我

脚注[1]是的,智能编译器可以为您将
printf
优化为
putchar
,但不要依赖编译器来纠正惰性编码习惯

#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
**************************************************
**************************************************
**************************************************
*