我在Hackerrank中做了以下问题:
https://www.hackerrank.com/challenges/staircase?h_r=next-challenge&h_v=zen
基本上,代码必须打印出一个右对齐的楼梯"由"#"制成字符。因此,如果输入为6,则输出为:
#
##
###
####
#####
######
这是我提出的解决方案(在C中):
#include <stdio.h>
#include <string.h>
int main(){
int n,i;
scanf("%d",&n);
char str[]="";
for(i=0;i<n;i++)
strcat(str,"#");
for(i=0;i<n;i++)
printf("%*.*s\n",n,i+1,str);
return 0;
}
但这不起作用,我似乎无法弄清楚错误是什么。我 没有寻找新的解决方案 。我只是想知道我的代码做错了什么。
TIA!
答案 0 :(得分:2)
char str[]="";
您没有指定str
的长度。
做点什么
char str[10]="";//where 10 is the safest number you think.You should
//not have more than 10 characters.
答案 1 :(得分:2)
您正在观察strcat的这种行为:
如果目标数组不足以容纳
src
和dest
的内容以及终止空字符,则行为未定义。
因此,在通过strcat
向目标附加额外字符串之前,请确保相应地增加/调整目标的大小,以便:
destination_size >= strlen(dest)+strlen(src)+1
另一个问题是,您没有为每一行获得正确的空格宽度' '
。您需要嵌套的for
循环才能完成此任务。
答案 2 :(得分:2)
使用多个循环,嵌套循环,复杂逻辑等忽略答案
在单个循环中只需格式化为printf
:
(IDEOne code)
(这几乎是你的解决方案,但没有strcat
,只使用硬编码字符串)
#include <stdio.h>
int main(void)
{
int level = 6;
for(int i=1; i<=level; ++i)
printf("%*.*s\n", level, i, "#####################");
return 0;
}
我修复了您的解决方案,使用memset
代替strcat
,并略微更改了for循环。
就我个人而言,我仍然更喜欢"###########"
长memset
的常量字符串。
#include <stdio.h>
#include <string.h>
int main(void) {
int n,i;
char str[50];
scanf("%d\n",&n);
memset(str, '#', sizeof(str));
for(i=1;i<=n;i++)
printf("%*.*s\n",n,i,str);
return 0;
}
答案 3 :(得分:0)
请看一下: -
#include <stdio.h>
#include <string.h>
int main(){
int n,i,j,k;
scanf("%d",&n);
for(k=0;k<n;k++)
{
for(i=n-1;i>k;i--)
{
printf(" ");
}
for(j=0;j<k+1;j++)
printf("*");
printf("\n");
}
return 0;
}
答案 4 :(得分:0)
给定五个正整数,找出可以通过正好将五个整数中的四个相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行,由两个空格分隔的长整数组成。
这是一个 C# 解决方案:
int n = 6;
for (int i = 0; i <= n; i++)
{
string step = "";
for (int k = 0; k < n - i; k++)
{
step += " ";
}
for (int j = 0; j < i; j++)
{
step += "#";
}
if (i > 0)
{
Console.WriteLine(step);
}
}
答案 5 :(得分:-3)
#include<stdio.h>
int main(){
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j<=n-1)
printf("#");
else
printf(" ");
}
printf("\n");
}
return 0;
}