我要制作一行星星,每行包含比前一行更多的星星。我的问题的关键是我不知道如何在C中将字符串相乘。
#include<stdio.h>
#include<conio.h>
main()
{
int max = 10
for (int i = 1; i <= max; ++i){
printf("*"*(2 * i - 1);
}
}
答案 0 :(得分:2)
您可以重复打印所需数量的字符串。
#include<stdio.h>
#include<conio.h>
main()
{
int max = 10; // a semicolon is added to make it compile
for (int i = 1; i <= max; ++i){
for (int j = 0; j < (2 * i - 1); j++){ // repeat (2 * i - 1) times
printf("*");
}
printf("\n"); // separate lines
}
}
我尊重原始代码,因此仍然存在一些不好的地方(毫无意义的包括非标准conio.h
和非标准定义main()
(而不是int main(void)
))
答案 1 :(得分:2)
语言语义不支持您尝试执行的操作。在C语言中,字符串无论如何都不是一流的类型-它只是char
的数组,因此所有字符串处理都是通过函数执行的;您无法对其进行直接操作;即使您不确定乘就是其中之一-使用非常简单的操作即可轻松实现非常有限的用例。
在这种情况下,由于您直接输出字符串,因此实际上不需要重复的字符串复制(或按您的说法乘以),因此不需要存储字符串以及随之而来的相关内存分配问题。相反,您只需要重复输出字符串即可。
#include <stdio.h>
void printRepeatString( const char* str, int n )
{
for( int i = 0; i < n; n++ )
{
printf( "%s", str ) ;
}
}
int main( void )
{
const int max = 10
for (int i = 1; i <= max; i++ )
{
printRepeatString( "*", (2 * i) - 1 ) ;
putchar( '\n' ) ;
}
return 0 ;
}
答案 2 :(得分:0)
“乘以” '*'
字符串的一种替代方法是创建最长的字符串,然后打印其中的截短部分。
使用"%.*s", n, s
打印最多s
个字符的字符数组n
。
#include<stdio.h>
#define MAX 10
int main(void) {
char s[2 * MAX] = {0};
memset(s, '*', 2 * MAX - 1);
for (int i = 1; i <= MAX; ++i) {
printf("%.*s\n", 2 * i - 1, s);
}
}
输出
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************