C 编程模式打印以下模式

问题描述 投票:0回答:4

我曾尝试打印以下图案,但我只能从一侧减少字母,而不能从两侧减少字母

请有人帮助我: 打印这个图案

这是我使用的代码:

#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;
}
c char printf nested-loops c-strings
4个回答
3
投票

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
以防数据需要保留。


2
投票

有几处逻辑错误

首先,外层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' );
}

1
投票

我的解决方案与 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;
}

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.