如果参数小于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;
}
答案 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] 是的,智能编译器可以为您优化printf
到putchar
,但不要依赖编译器来修复懒惰的编码习惯。