2017-04-12 2 views
-1

私はsprintfを使用しての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

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+1

Yep - @ a3fはそれを持っています。また、この行 'tagstr [strlen(tagstr) - 1] = '\ 0';は....間違っているだけでなく不要です。また、あなたの配列の初期サイズは約n = 4まで十分に大きくない – LoztInSpace

答えて

2

コードには2つの大きな問題があります。コメントの中で既に述べたように、posを増やしてはいけませんが、(ほぼ)同じ値で何度も何度も再割り当てしてください。 (k場合> = 10になると数字が、それによってより多くの桁数になるだろうか5)したがって、最初の反復の後、あなたは常に4の位置に書き込みます、

第二に、あなたの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; 
} 
関連する問題