2016-12-24 116 views
1

我做了以下問題在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; 
} 

但這不是工作,我可以」 t似乎弄清楚了什麼是錯的。我是不是在尋找新的解決方案。我只想知道我的代碼做錯了什麼。

TIA!

+1

請閱讀[strcat']文檔(http://en.cppreference.com/w/c/string/byte/strcat)。你需要足夠的緩衝空間在你的目的地。 – WhiZTiM

+1

你必須分配足夠的內存給* str *來保存*#* –

+0

*我不是在尋找新的解決方案。* - 取決於「新解決方案」的含義。不得不分配空間也可能是一種「新的解決方案」,因爲執行代碼可能與您最初編寫的代碼看起來有很大不同。 – PaulMcKenzie

回答

2
char str[]=""; 

您沒有指定長度str。 這樣做

char str[10]="";//where 10 is the safest number you think.You should 
        //not have more than 10 characters. 
+0

你是對的!有效。我會在接下來的2個小時裏因爲我犯了這樣一個愚蠢的錯誤而感到沮喪。 但是,有沒有辦法在C中創建一個字符串而不指定大小? –

+2

在C中,您必須指定大小。 –

+0

還有一件事。當我運行代碼時,它已經正確打印了第一行。代碼從第二行開始弄亂了。這就是爲什麼我不認爲這是數組長度分配問題。 –

2

strcat這種行爲,你正在觀察:

的行爲是不確定的,如果目標數組不夠大,兩個srcdest和終止空字符的內容。

所以,附加額外字符串到目的地通過strcat之前,請確保目標的大小增加/調整,因此這樣的:

destination_size >= strlen(dest)+strlen(src)+1 

另一個問題是,你沒有得到每行的空間的正確寬度爲' '。您需要嵌套for循環才能完成此操作。

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; 
} 
+0

OP:我不是在尋找新的解決方案。 –

+0

好吧,我會按照要求更新代碼。 – Codesingh

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; 
} 
+0

謝謝! 'memset()'正是我所期待的。 「 –

+0

」_個人而言,我仍然更喜歡一個長的常量string_「。使用memset()比使用非常大的字符串更有效嗎? –

+0

從何種意義上說高效?您可以節省幾個字節,但我不認爲一個包含50個字符的硬編碼數組會對您的計算機造成負擔,我認爲這會使代碼更加明顯。 – abelenky