前言
如果前面四个章节,认真学习了,这三道题目,会让你更加深刻的感受到,认真读书,这四个字究竟是什么程度。特别是,5.21这道题目,把一个细节放大了,即需要注意字符的输入。
分析
在5.21这道题目中,需要我们输入要绘制的图形,图形在这里是用字符来表示。在每次输入后,都需要按下回车键把内容输入,回车键即换行符“\n”本身属于字符,也就是说,每次按下回车键会对应产生一个字符为换行符“\n”,它也会被读取。所以,我们要对其进行处理,过滤掉。
在第4章,4.7节,switch多重选择语句的示例中,有提到过相关内容。在5.21这道题目中,不太适合选用switch多重选择语句,那就要对该问题使用别的方法进行处理。
解决
5.19题目:
#include <stdio.h>
void matrix(int side);
int main(void)
{
int x;
printf("%s", "Enter a integer: ");
scanf("%d", &x);
matrix(x);
}
void matrix(int side)
{
for (int i = 1; i <= side; i++)
{
for (int i = 1; i <= side; i++)
{
printf("%s", "*");
}
puts("");
}
}
运行结果:
5.20题目:
#include <stdio.h>
void matrix(int side, char fillCharacter);
int main(void)
{
int x;
printf("%s", "Enter a integer: ");
scanf("%d", &x);
matrix(x, '#');
}
void matrix(int side, char fillCharacter)
{
for (int i = 1; i <= side; i++)
{
for (int i = 1; i <= side; i++)
{
printf("%c", "*");
}
puts("");
}
}
注意,打印时使用%c,而不是%s。%c用来打印单个字符,%s用来打印字符串。
在第2章,2.7节,安全的C程序设计中,有讲到关于%s的使用,如下图所示。
同样,在第4章,4.7节,switch多重选择语句,有讲到相关的内容,如下图所示。
运行结果:
5.21题目:
#include <stdio.h>
void matrix(int side, char fillCharacter);
int main(void)
{
int x;
char y;
printf("%s", "Enter a integer: ");
scanf("%d", &x);
printf("%s", "Enter a char: ");
scanf(" %c", &y);
matrix(x, y);
}
void matrix(int side, char fillCharacter)
{
for (int i = 1; i <= side; i++)
{
for (int i = 1; i <= side; i++)
{
printf("%c", fillCharacter);
}
puts("");
}
}
注意,在scanf中的%c前面,添加一个空格。
当用户输入一个整数并按下回车时,会在输入缓冲区中留下一个换行符。当使用scanf读取字符时,它会读取这个换行符,而不是等待用户输入。为了解决这个问题,在scanf语句中的%c之前加一个空格,以消耗掉换行符。
在 C 语言中,空格字符(包括空格、制表符和换行符)在 scanf 函数中的格式字符串中具有特殊的含义。当 scanf 遇到空格字符时,它会尝试从输入缓冲区中跳过任意数量的空格字符(包括换行符)直到遇到非空格字符为止。
运行结果:
至此,程序可以绘制各种形状的图形。
需要注意的点,在第4章,4.7节,switch多重选择语句的示例中,有提到过处理“换行”、“tab”和“空格”字符相关内容。那里使用的是switch多重选择语句,同时,也提到switch多重选择语句中的case只能进行整型数据判断,显然在5.21这道题目中不适合使用,需要对此查询相应的解决办法。