c语言输出菱形图案
下面对代码进行解释:
首先定义两个宏用MIDDLE值得第一个*在40列出输出,而STAR则代表多个“*”或“0”的字符,11行输入n值,则输出的行数为和中间最宽的那一行均为2*n-1,第一个for循环用于输出上三角,第二个则输出下三角。相对应的输出sp-1个空白符的时候,同时输出2*i-1个“*”或“0”字符,这个有我们自己定,这里有必要解释一下,关于17行语言的代码:
printf("%*c %.*s\n", sp - 1, ' ', 2*i-1, STAR);
首先说一下关于%*中的*号,在这里叫做赋值抑制符。他的作用是:标准说法:星号(赋值抑制符)对赢的输入项按要求被扫视输入,但结果不存贮,带星号的说明不对应输入数据存贮地址,用它来跳出一个输入数据项(这是向对于scanf输入来说的),
在这里,对于printf来说,以11行代码为例,%*c字符“*”表示输出域由对应的输出项来确定,上述“*”对应的输出项是sp-1(假设sp-1等于4),那么%*c就相当于%4c,那么他就以%4c的格式输出' ' (空格)。 同样的对应%.*s也相类似,但这里注意了为%.*s而非%*s
(里面有点'.'),如果你误写成后者,这样会得不到正确的结果哦!那么%.*s 和%*s到底有什么区别呢?%*s用法类似于%*c,
c输出元值为其ASCII码的字符,而s则代表输出的一个字符串,
(1)用格式符“%c”输入或输出一个字符,即逐个字符输入输出。
(2)用“%s”,则将整个字符串一次输入或输出。
举例:如果S = ABCDEF
那么对于printf("%3s, %4.2s, %-7.4s, %.5s", s, s, s, s);则输出
ABCDEF, AB,ABCD ,ABCDE
如果懂了这个,相信大家也就知道%.*s怎么用了吧!
这里值得一提的是,对于宏STAR的定义里面的字符数必须做够多,否则当我们把n输入很多后,可能自得不到我们预期的结果,即输出的可能就不会是菱形了,这个大家可以验证一下,那么这是为什么了,因为%.*s的输出总要依赖于STAR,当前要求输入很大时,而STAR有不够提供,那么当然会出现问题了,利用STAR的字符数多少,我们还可以相应的变换输出的图案,可以实现多种不同的图形哦,有兴趣不妨试一下。