只要稍微改变一点思考问题,就可以大大简化逻辑。
首先,从不使用可变参数printf
函数输出单个字符 - 这是作业的错误工具。取而代之的是使用putchar()
或fputc
这是面向字符输出函数。 [1]
使用void
功能时,没有理由不能在函数中的任何点使用return
。在完成所需的代码块后,您可以使用此优势来避免嵌套if{} else{}...
只需return
。
下,不使用幻数整个代码。如果您需要50
的常数,那么#define
之一,例如
#define LNSZ 50
如果你决定让你的行大小60
这样的话,只有一个地方,交通方便,在你的代码的顶部在那里你可以进行更改。不需要去选择多个for
循环声明来更改每个循环限制。
把这些拼在一起,你可以重写你的drawline
功能如下(注:传统Ç避免使用驼峰函数名)
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
你,但不依赖于编译器来解决懒惰的编码习惯。