Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是我的C代码没有打印#在楼梯模式中,这是来自hackerrank的,我没有通过所有测试用例,但我可以';我不能指出原因吗?_C_For Loop_If Statement - Fatal编程技术网

什么是我的C代码没有打印#在楼梯模式中,这是来自hackerrank的,我没有通过所有测试用例,但我可以';我不能指出原因吗?

什么是我的C代码没有打印#在楼梯模式中,这是来自hackerrank的,我没有通过所有测试用例,但我可以';我不能指出原因吗?,c,for-loop,if-statement,C,For Loop,If Statement,编写一个程序,打印一个大小为n的楼梯 我没有通过所有的测试用例,也不知道我在哪里犯了错误 这是我的代码: void staircase(int n) { char a[n][n]; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if((i + j) > ((n / 2) + 1)) { a[i][j] = '#';

编写一个程序,打印一个大小为n的楼梯

我没有通过所有的测试用例,也不知道我在哪里犯了错误

这是我的代码:

void staircase(int n) {
    char a[n][n];
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if((i + j) > ((n / 2) + 1)) {
                a[i][j] = '#';
                printf("%c", a[i][j]);
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
}

说明:


楼梯是右对齐的,由#符号和空间组成,高度和宽度为
n=6

有一种比你要做的更简单的方法:

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const int n = 6;
    char* str = malloc(sizeof(*str)*(n + 1));
    if (str == NULL) {
        printf("Somthing wrong with memory!\n");
        return 1;
    }
    memset(str, ' ', n);
    str[n] = '\0';
    for(int i = n - 1; i > -1; i--) {
        str[i] = '#';
        puts(str); //or maybe printf who cares
    }
    free(str);
    return 0;
}
#包括
#包括
#包括
内部主(空){
常数int n=6;
char*str=malloc(sizeof(*str)*(n+1));
如果(str==NULL){
printf(“内存有问题!\n”);
返回1;
}
膜组(str,,,n);
str[n]='\0';
对于(int i=n-1;i>-1;i--){
str[i]=“#”;
puts(str);//或者printf谁在乎呢
}
自由基(str);
返回0;
}

您不需要
变量来执行所需的操作。以下是一个实现您所需的示例:

void staircase(unsigned n)
{
        for (unsigned i = 0; i < n; ++i) {
                for (unsigned j = 0; j < (n - i - 1); ++j)
                        printf(" ");
                for (unsigned j = 0; j < (i + 1); ++j)
                        printf("#");
                printf("\n");
        }
}
void楼梯(无符号n)
{
for(无符号i=0;i

第一个循环意味着覆盖每一行,然后在其中创建一个循环来处理实际
符号之前的空格,最后创建一个循环来处理符号的显示。

问题在于条件

if((i + j) > ((n / 2) + 1))
应该是

if(j >= n - i - 1)    // or   if(i + j >= n - 1)
为了使这更容易,我将创建一个helper函数。此外,不需要VLA
a[n][n]
,您甚至不用它来做任何事情

void repeat_char(int x, char ch) {
    for(int i=0; i < x; ++i) putchar(ch);
}

void staircase(int n) {
    for(int i = 1; i <= n; ++i) {        
        repeat_char(n - i, ' ');   // or  printf("%*s", n - i, "");
        repeat_char(i, '#');
        putchar('\n');
    }
}
void repeat\u char(int x,char ch){
对于(int i=0;i对于(i)= 1;我要提供您的预期输出和您的程序的输出。如果您使用C语言,您用C++来标记谁?您用“代码> %= 1”<代码>的故障测试用例应该打印一个空间还是一个OcthRope?@ Talk?这些代码是失败的隐藏测试用例。可见的测试用例。printf输出一个字符的代价很高,否则您可以要求printf输出第一个字符的预期缩进,而不是自己做。谢谢您的评论,但是任何现代编译器都不会自己进行优化吗?在这个级别上,这不是“优化”,您要求的太多;-)你会感到惊讶的!我刚刚检查了一下,9.3似乎成功了!下面是编译过程和汇编结果:;第148、158和165行将C代码的
printf
”替换为
putchar
,从某种意义上说,这是令人伤心的,无论如何,你不能假设你有那种编译器,最好你自己做,不是吗?谢谢,条件是错误的。你的建议有帮助:)您编写的代码要简单得多,但我是一名初学者,我想编写如此简洁易懂的代码需要一些时间。@sb7可能需要一些时间来确定您可以分解哪些部分并将其放入简单函数中,这些函数只需做一件像
repeat\u char
函数这样的小事,但始终要注意这些部分。:-)
void repeat_char(int x, char ch) {
    for(int i=0; i < x; ++i) putchar(ch);
}

void staircase(int n) {
    for(int i = 1; i <= n; ++i) {        
        repeat_char(n - i, ' ');   // or  printf("%*s", n - i, "");
        repeat_char(i, '#');
        putchar('\n');
    }
}