2017-04-12 57 views
-1

我正在使用sprintf來打印int變量應該顯示1^2+2^2+3^2+4^2+5^2+6^2。但我的代碼只打印1^2+6^2。我不知道爲什麼中間部分不見了。C編程sprinf問題

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

char* formatSeries(int n) 
{ 
    char *tagstr = (char *)malloc(sizeof(char)*n*n); 

    int pos = 0 ; 
    int k; 

    for (k = 1; k <= n; k++) 
    { 
    pos = sprintf(&tagstr[pos], "%d^2+", k); 
    } 
    tagstr[strlen(tagstr) - 1] = '\0'; 

    return tagstr; 
} 

void main() 
{ 
    int n = 6; 
    printf("%s \n", formatSeries(n)); 
} 
+8

s /'pos = sprintf' /'pos + = sprintf'? – a3f

+4

[請參閱此討論,爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+1

是的 - @ a3f有它。另外這行'tagstr [strlen(tagstr) - 1] ='\ 0';'是....錯誤...以及不必要的。另外,你的數組的初始大小還不夠大,直到大約n = 4 – LoztInSpace

回答

2

你的代碼有兩個主要問題;正如評論中已經提到的那樣 - 是你不會增加pos,而是一次又一次以(幾乎)相同的價值重新分配它。因此,在第一次迭代之後,你會不斷地寫入位置4(或5如果k將成爲> = 10,號碼將因此獲得更多的數字),

其次,你的malloc不會爲小k工作s,因爲每個字符串如"+1^2"至少需要4個字符;所以如果你使用n * n來調整緩衝區的大小,那麼如果n是< = 3,那麼緩衝區將會太小,並且(如果n變大,則可能太多)太大。

我建議假設最大範圍爲n(假設最多7位數字)並相應地確定緩衝區的大小。

一個小問題(而不是必需的)是,你可能可以避免寫多餘的+,因爲你在第一次迭代時使用了不同的格式字符串;只是確實表現出這個想法,真的不是必需的:

char* formatSeries(int n) 
{ 
    const size_t maxSize = n * (7+3) + 1; 

    char *tagstr = (char *)malloc(sizeof(char)*maxSize); 

    int pos = 0 ; 
    int k; 
    for (k = 1; k <= n; k++) 
    { 
     const char* formatStr = (k==1) ? "%d^2" : "+%d^2"; 
     pos += sprintf(&tagstr[pos], formatStr, k); 

    } 
    return tagstr; 
}