我曾尝试打印以下图案,但我只能从一侧减少字母,而不能从两侧减少字母
请有人帮助我: 打印这个图案
这是我使用的代码:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Programming";
int len = strlen(str);
for (int i = 0; i < len; i++) {
for (int j = i; j<len; j++) {
printf("%c", str[j]);
}
printf("\n");
}
return 0;
}
KISS Principle 解决方案具有运行速度快且易于阅读的优点:
#include <stdio.h>
#include <string.h>
int main (void)
{
char str[] = "Programming";
int len = strlen(str);
for (int i = 0; str[i]!='\0'; i++)
{
puts(&str[i]);
str[len-i-1] = '\0';
}
}
首先复制
str
以防数据需要保留。
有几处逻辑错误
首先,外层for循环
for (int i = 0; i < len; i++) {
指定不正确的迭代次数。根据循环,迭代次数等于
len
。然而实际上迭代次数应该等于( len + 1 ) / 2
.
其次是内部for循环
for (int j = i; j<len; j++) {
printf("%c", str[j]);
}
输出字符直到
len
的值,而len
应该在每次内部for循环后减少。
你可以写一个单独的函数,例如
#include <stdio.h>
#include <string.h>
void print_pattern( const char *s )
{
for (const char *first = s, *last = s + strlen( s ); first < last; ++first, --last )
{
printf( "%.*s\n", ( int )( last - first ), first );
}
}
int main( void )
{
const char *s = "Programming";
print_pattern( s );
}
程序输出为
Programming
rogrammin
ogrammi
gramm
ram
a
如果传递的字符串的长度适合
int
类型的对象,该函数将起作用。否则,您可以像嵌套 for 循环一样使用嵌套 for 循环,例如
void print_pattern( const char *s )
{
for (const char *first = s, *last = s + strlen( s ); first < last; ++first, --last )
{
for (const char *current = first; current != last; ++current)
{
putchar( *current );
}
putchar( '\n' );
}
}
简而言之,您的 for 循环应该如下所示
for ( size_t i = 0, n = strlen( str ); i < n; i++, n-- )
{
for ( size_t j = i; j < n; j++ )
{
putchar( str[j] );
}
putchar( '\n' );
}
我的解决方案与 Vlad 的类似,但使用
%*.*s
而不仅仅是 %.*s
#include <stdio.h>
#include <string.h>
int main(void) {
char txt[] = "Programming";
int len = strlen(txt);
for(int i=0; i<=len/2; ++i)
{
printf("%*.*s\n", len-2*i, len-2*i, txt+i);
}
return 0;
}
有人说在打印过程中必须保持字符串不受影响吗?
您可以通过在每次迭代中用零覆盖最后一个字符来截断字符串。同时可以提前打印起点
#include <stdio.h>
#include <string.h>
int main (void)
{
char str[] = "Programming";
char *head = str;
char *tail = str + strlen(str);
while (head < tail)
{
puts(head++);
*--tail = 0;
}
}