C 一行最多打印50个字符,如果参数为55,则打印一行新字符
我想画一行字符,如果参数小于0,必须在这行上打印50个字符。如果参数超过50,则必须打印前50个字符,新行然后继续打印字符,直到参数变为0。 当参数超过50时,我不知道如何在一行上打印前50个字符,然后在新行上打印剩余的字符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
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你可以通过稍微不同地思考问题来大大简化你的逻辑
首先,切勿使用variadicprintf
函数输出单个字符——这是错误的作业工具。相反,请使用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
**************************************************
**************************************************
**************************************************
*