2015-09-06 42 views
0

我正在用C編寫一個程序,首先提示用戶輸入一個整數,然後輸出兩個字符串:一個空格和一個變量編號,以便結果是一個正確的棱錐,像這樣:Printf C中的多個可變數字字符串

 # 
    ## 
    ### 
    #### 
##### 
###### 

的問題我已經駐留在我的for循環,這裏是什麼樣子: (n是用戶提示的整數)

for (int i = 0 ; i < n ; i++) 
{ 
    printf("%c",n-1,' '); // printing the blank spaces gradually 
    printf("%c\n",i+2,'#'); // printing the hashes gradually 
} 

的想法是打印減少數量的空間和增量根據int減少哈希數。

P.S:請考慮幫我說我的代碼有什麼問題,而不是給我一個實際的新工作。

+1

歡迎來到堆棧溢出!不幸的是,這不是一個好的問題,這不是一個家庭作業幫助網站,雖然你可以找到很多信息,可以幫助你在這裏做你的功課。作爲發佈代碼的一般規則,您需要將其格式化爲代碼,您需要說明具體的錯誤消息/問題是什麼,並且通常您需要給出一個最簡單的工作示例。您應該查看幫助中心的問題指南,以便您知道什麼是將來發布的合適問題。 (這個很可能會被關閉,我很抱歉地說。) –

+1

這兩個'printf'調用實際上都會打印一次'(char)(n-1)'或'(char)(i + 2)'的值並忽略了其餘的論點。無論使用什麼makefile,只要你的編譯器支持它(或者調查你的編譯器提供的警告/警告級別選項)和'-Wextra',你應該至少在你的'cc'行中包含'-Wall'如果可能的話。這會在當前捕獲很多編碼錯誤,例如未使用的'printf'參數。一個常見的解決方案是在當前循環中打印'n-i-1'空格的循環,之後再打印另一個循環以打印'#''i'次。 –

+0

我已經從與問題沒有直接關係的問題中刪除了一些額外的東西,並且還添加了我認爲您希望輸出看起來像的內容。 (如果我錯了,請修復它!) – immibis

回答

0

你知道每行都有相同數量的字符,計數空格和#,這是n。在第一行中,你只有一個#,所以n-1個空格,第二行中有2個#,所以n-2個空格,等等。所以你從0迭代到n - 1,並且每次迭代都會打印一個字符,並且你只需要記錄已經打印了多少個字符。開始打印空格,一旦打印出足夠的空格,就打印一個#。代碼:

for (int i = 0 ; i < n ; i++) 
{ 
    int j = 0; 
    while (j < n) 
    { 
     if (j < n - i - 1) 
      printf(" "); 
     else 
      printf("#"); 
     j++; 
    } 
    printf("\n"); 
} 
1

首先,代碼的問題。它基於對printf的錯誤理解。 printf不能以代碼中所需的方式使用。而且,即使這樣做了,它也不會因爲你已經固定'n-1'而逐漸打印空間。你可能意思是'n-i',所以它可以逐漸縮小。

無論如何,要解決: 有很多解決方案,包括用新邏輯重寫。儘管如此,您仍然可以通過編寫自己的具有所需功能的printf變體來「修復」代碼。 e.g:

void mprintf(const char *fmt, int n, char c) 
{ 
    while (n--) 
    { 
     printf("%c", c); 
    } 
} 

並且代碼:

for (int i = 0 ; i < n ; i++) 
{ 
    mprintf("%c",n-i,' '); // printing the blank spaces gradually 
    mprintf("%c",i,'#'); // printing the hashes gradually 
    printf("\n"); 
} 

附加題: 瞭解如何通過刪除某些無用的東西簡化該代碼。

0

你說:

請考慮說什麼是錯我的代碼,而不是給我一個實際的新的工作一個幫助我。

忽略表面的改變,你的循環體目前:

for (int i = 0; i < n; i++) 
{ 
    printf("%c", n-1, ' '); // printing the blank spaces gradually 
    printf("%c\n", i+2, '#'); // printing the hashes gradually 
} 

的問題包括:

  • 參數太多的printf()電話。
  • %c需要一個參數,即要打印的字符。
  • 對於n = 6,您將打印Control-E而不是第一次打印的任何空白。
  • 對於第二次打印,您將會打印Control-BControl-G並且沒有散列。

你可以使用:

printf("%.*s", n - i - 1, " "); 

打印適當寬度的空白的領域。但是,您不能使用printf()重複單個字符,因此您必須使用其他技術(例如使用putchar()的循環)來打印適當數量的散列。

您應該閱讀並重新閱讀並重新閱讀printf()的規範。我必須每年閱讀幾次才能嘗試並保持最新狀態;我通常會在給定的重新閱讀中找到新的(或被遺忘的)。當然,我只用C語言編寫了30年,並且規範多年來發生了幾次變化(而且它還沒有變得更簡單!),所以這並不令人驚訝。